V0.6 #852
391
src/api.py
391
src/api.py
|
@ -26,7 +26,7 @@ from pyelliptic.openssl import OpenSSL
|
||||||
from struct import pack
|
from struct import pack
|
||||||
|
|
||||||
# Classes
|
# Classes
|
||||||
from helper_sql import sqlQuery,sqlExecute,SqlBulkExecute
|
from helper_sql import sqlQuery,sqlExecute,SqlBulkExecute,sqlStoredProcedure
|
||||||
from debug import logger
|
from debug import logger
|
||||||
|
|
||||||
# Helper Functions
|
# Helper Functions
|
||||||
|
@ -149,16 +149,218 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
||||||
|
|
||||||
return (status, addressVersionNumber, streamNumber, ripe)
|
return (status, addressVersionNumber, streamNumber, ripe)
|
||||||
|
|
||||||
|
def _handle_request(self, method, params):
|
||||||
|
if method == 'helloWorld':
|
||||||
|
(a, b) = params
|
||||||
|
return a + '-' + b
|
||||||
|
elif method == 'add':
|
||||||
|
(a, b) = params
|
||||||
|
return a + b
|
||||||
|
elif method == 'statusBar':
|
||||||
|
message, = params
|
||||||
|
shared.UISignalQueue.put(('updateStatusBar', message))
|
||||||
|
elif method == 'listAddresses' or method == 'listAddresses2':
|
||||||
|
data = '{"addresses":['
|
||||||
|
configSections = shared.config.sections()
|
||||||
|
for addressInKeysFile in configSections:
|
||||||
|
if addressInKeysFile != 'bitmessagesettings':
|
||||||
|
status, addressVersionNumber, streamNumber, hash01 = decodeAddress(
|
||||||
|
addressInKeysFile)
|
||||||
|
if len(data) > 20:
|
||||||
|
data += ','
|
||||||
|
if shared.config.has_option(addressInKeysFile, 'chan'):
|
||||||
|
chan = shared.config.getboolean(addressInKeysFile, 'chan')
|
||||||
|
else:
|
||||||
|
chan = False
|
||||||
|
label = shared.config.get(addressInKeysFile, 'label')
|
||||||
|
if method == 'listAddresses2':
|
||||||
|
label = label.encode('base64')
|
||||||
|
data += json.dumps({'label': label, 'address': addressInKeysFile, 'stream':
|
||||||
|
streamNumber, 'enabled': shared.config.getboolean(addressInKeysFile, 'enabled'), 'chan': chan}, indent=4, separators=(',', ': '))
|
||||||
|
data += ']}'
|
||||||
|
return data
|
||||||
|
elif method == 'listAddressBookEntries' or method == 'listAddressbook': # the listAddressbook alias should be removed eventually.
|
||||||
|
queryreturn = sqlQuery('''SELECT label, address from addressbook''')
|
||||||
|
if len(params) == 1:
|
||||||
|
label, = params
|
||||||
|
label = self._decode(label, "base64")
|
||||||
|
queryreturn = sqlQuery('''SELECT label, address from addressbook WHERE label = ?''', label)
|
||||||
|
elif len(params) > 1:
|
||||||
|
raise APIError(0, "Too many paremeters, max 1")
|
||||||
|
data = '{"addresses":['
|
||||||
|
for row in queryreturn:
|
||||||
|
label, address = row
|
||||||
|
label = shared.fixPotentiallyInvalidUTF8Data(label)
|
||||||
|
if len(data) > 20:
|
||||||
|
data += ','
|
||||||
|
data += json.dumps({'label':label.encode('base64'), 'address': address}, indent=4, separators=(',', ': '))
|
||||||
|
data += ']}'
|
||||||
|
return data
|
||||||
|
elif method == 'getAddressBookEntry': # search by label
|
||||||
|
if len(params) != 1:
|
||||||
|
raise APIError(0, "I need a label")
|
||||||
|
label, = params
|
||||||
|
label = self._decode(label, "base64")
|
||||||
|
queryreturn = sqlQuery('''SELECT label, address from addressbook WHERE label = ?''', label)
|
||||||
|
data = '{"address":['
|
||||||
|
for row in queryreturn:
|
||||||
|
label, address = row
|
||||||
|
label = shared.fixPotentiallyInvalidUTF8Data(label)
|
||||||
|
if len(data) > 20:
|
||||||
|
data += ','
|
||||||
|
data += json.dumps({'label':label.encode('base64'), 'address': address}, indent=4, separators=(',', ': '))
|
||||||
|
data += ']}'
|
||||||
|
return data
|
||||||
|
|
||||||
|
elif method == 'addAddressBookEntry' or method == 'addAddressbook': # the addAddressbook alias should be deleted eventually.
|
||||||
|
if len(params) != 2:
|
||||||
|
raise APIError(0, "I need label and address")
|
||||||
|
address, label = params
|
||||||
|
label = self._decode(label, "base64")
|
||||||
|
address = addBMIfNotPresent(address)
|
||||||
|
self._verifyAddress(address)
|
||||||
|
queryreturn = sqlQuery("SELECT address FROM addressbook WHERE address=?", address)
|
||||||
|
if queryreturn != []:
|
||||||
|
raise APIError(16, 'You already have this address in your address book.')
|
||||||
|
|
||||||
#Request Handlers
|
sqlExecute("INSERT INTO addressbook VALUES(?,?)", label, address)
|
||||||
|
shared.UISignalQueue.put(('rerenderInboxFromLabels',''))
|
||||||
def HandleListAddresses(self, method):
|
shared.UISignalQueue.put(('rerenderSentToLabels',''))
|
||||||
data = '{"addresses":['
|
shared.UISignalQueue.put(('rerenderAddressBook',''))
|
||||||
configSections = shared.config.sections()
|
return "Added address %s to address book" % address
|
||||||
for addressInKeysFile in configSections:
|
elif method == 'deleteAddressBookEntry' or method == 'deleteAddressbook': # The deleteAddressbook alias should be deleted eventually.
|
||||||
if addressInKeysFile != 'bitmessagesettings':
|
if len(params) != 1:
|
||||||
status, addressVersionNumber, streamNumber, hash01 = decodeAddress(
|
raise APIError(0, "I need an address")
|
||||||
addressInKeysFile)
|
address, = params
|
||||||
|
address = addBMIfNotPresent(address)
|
||||||
|
self._verifyAddress(address)
|
||||||
|
sqlExecute('DELETE FROM addressbook WHERE address=?', address)
|
||||||
|
shared.UISignalQueue.put(('rerenderInboxFromLabels',''))
|
||||||
|
shared.UISignalQueue.put(('rerenderSentToLabels',''))
|
||||||
|
shared.UISignalQueue.put(('rerenderAddressBook',''))
|
||||||
|
return "Deleted address book entry for %s if it existed" % address
|
||||||
|
elif method == 'createRandomAddress':
|
||||||
|
if len(params) == 0:
|
||||||
|
raise APIError(0, 'I need parameters!')
|
||||||
|
elif len(params) == 1:
|
||||||
|
label, = params
|
||||||
|
eighteenByteRipe = False
|
||||||
|
nonceTrialsPerByte = shared.config.get(
|
||||||
|
'bitmessagesettings', 'defaultnoncetrialsperbyte')
|
||||||
|
payloadLengthExtraBytes = shared.config.get(
|
||||||
|
'bitmessagesettings', 'defaultpayloadlengthextrabytes')
|
||||||
|
elif len(params) == 2:
|
||||||
|
label, eighteenByteRipe = params
|
||||||
|
nonceTrialsPerByte = shared.config.get(
|
||||||
|
'bitmessagesettings', 'defaultnoncetrialsperbyte')
|
||||||
|
payloadLengthExtraBytes = shared.config.get(
|
||||||
|
'bitmessagesettings', 'defaultpayloadlengthextrabytes')
|
||||||
|
elif len(params) == 3:
|
||||||
|
label, eighteenByteRipe, totalDifficulty = params
|
||||||
|
nonceTrialsPerByte = int(
|
||||||
|
shared.networkDefaultProofOfWorkNonceTrialsPerByte * totalDifficulty)
|
||||||
|
payloadLengthExtraBytes = shared.config.get(
|
||||||
|
'bitmessagesettings', 'defaultpayloadlengthextrabytes')
|
||||||
|
elif len(params) == 4:
|
||||||
|
label, eighteenByteRipe, totalDifficulty, smallMessageDifficulty = params
|
||||||
|
nonceTrialsPerByte = int(
|
||||||
|
shared.networkDefaultProofOfWorkNonceTrialsPerByte * totalDifficulty)
|
||||||
|
payloadLengthExtraBytes = int(
|
||||||
|
shared.networkDefaultPayloadLengthExtraBytes * smallMessageDifficulty)
|
||||||
|
else:
|
||||||
|
raise APIError(0, 'Too many parameters!')
|
||||||
|
label = self._decode(label, "base64")
|
||||||
|
try:
|
||||||
|
unicode(label, 'utf-8')
|
||||||
|
except:
|
||||||
|
raise APIError(17, 'Label is not valid UTF-8 data.')
|
||||||
|
shared.apiAddressGeneratorReturnQueue.queue.clear()
|
||||||
|
streamNumberForAddress = 1
|
||||||
|
shared.addressGeneratorQueue.put((
|
||||||
|
'createRandomAddress', 4, streamNumberForAddress, label, 1, "", eighteenByteRipe, nonceTrialsPerByte, payloadLengthExtraBytes))
|
||||||
|
return shared.apiAddressGeneratorReturnQueue.get()
|
||||||
|
elif method == 'createDeterministicAddresses':
|
||||||
|
if len(params) == 0:
|
||||||
|
raise APIError(0, 'I need parameters!')
|
||||||
|
elif len(params) == 1:
|
||||||
|
passphrase, = params
|
||||||
|
numberOfAddresses = 1
|
||||||
|
addressVersionNumber = 0
|
||||||
|
streamNumber = 0
|
||||||
|
eighteenByteRipe = False
|
||||||
|
nonceTrialsPerByte = shared.config.get(
|
||||||
|
'bitmessagesettings', 'defaultnoncetrialsperbyte')
|
||||||
|
payloadLengthExtraBytes = shared.config.get(
|
||||||
|
'bitmessagesettings', 'defaultpayloadlengthextrabytes')
|
||||||
|
elif len(params) == 2:
|
||||||
|
passphrase, numberOfAddresses = params
|
||||||
|
addressVersionNumber = 0
|
||||||
|
streamNumber = 0
|
||||||
|
eighteenByteRipe = False
|
||||||
|
nonceTrialsPerByte = shared.config.get(
|
||||||
|
'bitmessagesettings', 'defaultnoncetrialsperbyte')
|
||||||
|
payloadLengthExtraBytes = shared.config.get(
|
||||||
|
'bitmessagesettings', 'defaultpayloadlengthextrabytes')
|
||||||
|
elif len(params) == 3:
|
||||||
|
passphrase, numberOfAddresses, addressVersionNumber = params
|
||||||
|
streamNumber = 0
|
||||||
|
eighteenByteRipe = False
|
||||||
|
nonceTrialsPerByte = shared.config.get(
|
||||||
|
'bitmessagesettings', 'defaultnoncetrialsperbyte')
|
||||||
|
payloadLengthExtraBytes = shared.config.get(
|
||||||
|
'bitmessagesettings', 'defaultpayloadlengthextrabytes')
|
||||||
|
elif len(params) == 4:
|
||||||
|
passphrase, numberOfAddresses, addressVersionNumber, streamNumber = params
|
||||||
|
eighteenByteRipe = False
|
||||||
|
nonceTrialsPerByte = shared.config.get(
|
||||||
|
'bitmessagesettings', 'defaultnoncetrialsperbyte')
|
||||||
|
payloadLengthExtraBytes = shared.config.get(
|
||||||
|
'bitmessagesettings', 'defaultpayloadlengthextrabytes')
|
||||||
|
elif len(params) == 5:
|
||||||
|
passphrase, numberOfAddresses, addressVersionNumber, streamNumber, eighteenByteRipe = params
|
||||||
|
nonceTrialsPerByte = shared.config.get(
|
||||||
|
'bitmessagesettings', 'defaultnoncetrialsperbyte')
|
||||||
|
payloadLengthExtraBytes = shared.config.get(
|
||||||
|
'bitmessagesettings', 'defaultpayloadlengthextrabytes')
|
||||||
|
elif len(params) == 6:
|
||||||
|
passphrase, numberOfAddresses, addressVersionNumber, streamNumber, eighteenByteRipe, totalDifficulty = params
|
||||||
|
nonceTrialsPerByte = int(
|
||||||
|
shared.networkDefaultProofOfWorkNonceTrialsPerByte * totalDifficulty)
|
||||||
|
payloadLengthExtraBytes = shared.config.get(
|
||||||
|
'bitmessagesettings', 'defaultpayloadlengthextrabytes')
|
||||||
|
elif len(params) == 7:
|
||||||
|
passphrase, numberOfAddresses, addressVersionNumber, streamNumber, eighteenByteRipe, totalDifficulty, smallMessageDifficulty = params
|
||||||
|
nonceTrialsPerByte = int(
|
||||||
|
shared.networkDefaultProofOfWorkNonceTrialsPerByte * totalDifficulty)
|
||||||
|
payloadLengthExtraBytes = int(
|
||||||
|
shared.networkDefaultPayloadLengthExtraBytes * smallMessageDifficulty)
|
||||||
|
else:
|
||||||
|
raise APIError(0, 'Too many parameters!')
|
||||||
|
if len(passphrase) == 0:
|
||||||
|
raise APIError(1, 'The specified passphrase is blank.')
|
||||||
|
if not isinstance(eighteenByteRipe, bool):
|
||||||
|
raise APIError(23, 'Bool expected in eighteenByteRipe, saw %s instead' % type(eighteenByteRipe))
|
||||||
|
passphrase = self._decode(passphrase, "base64")
|
||||||
|
if addressVersionNumber == 0: # 0 means "just use the proper addressVersionNumber"
|
||||||
|
addressVersionNumber = 4
|
||||||
|
if addressVersionNumber != 3 and addressVersionNumber != 4:
|
||||||
|
raise APIError(2,'The address version number currently must be 3, 4, or 0 (which means auto-select). ' + addressVersionNumber + ' isn\'t supported.')
|
||||||
|
if streamNumber == 0: # 0 means "just use the most available stream"
|
||||||
|
streamNumber = 1
|
||||||
|
if streamNumber != 1:
|
||||||
|
raise APIError(3,'The stream number must be 1 (or 0 which means auto-select). Others aren\'t supported.')
|
||||||
|
if numberOfAddresses == 0:
|
||||||
|
raise APIError(4, 'Why would you ask me to generate 0 addresses for you?')
|
||||||
|
if numberOfAddresses > 999:
|
||||||
|
raise APIError(5, 'You have (accidentally?) specified too many addresses to make. Maximum 999. This check only exists to prevent mischief; if you really want to create more addresses than this, contact the Bitmessage developers and we can modify the check or you can do it yourself by searching the source code for this message.')
|
||||||
|
shared.apiAddressGeneratorReturnQueue.queue.clear()
|
||||||
|
logger.debug('Requesting that the addressGenerator create %s addresses.', numberOfAddresses)
|
||||||
|
shared.addressGeneratorQueue.put(
|
||||||
|
('createDeterministicAddresses', addressVersionNumber, streamNumber,
|
||||||
|
'unused API address', numberOfAddresses, passphrase, eighteenByteRipe, nonceTrialsPerByte, payloadLengthExtraBytes))
|
||||||
|
data = '{"addresses":['
|
||||||
|
queueReturn = shared.apiAddressGeneratorReturnQueue.get()
|
||||||
|
for item in queueReturn:
|
||||||
if len(data) > 20:
|
if len(data) > 20:
|
||||||
data += ','
|
data += ','
|
||||||
if shared.config.has_option(addressInKeysFile, 'chan'):
|
if shared.config.has_option(addressInKeysFile, 'chan'):
|
||||||
|
@ -908,108 +1110,73 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
||||||
'''SELECT hash, payload FROM inventory WHERE tag = '' and objecttype = 2 ; ''')
|
'''SELECT hash, payload FROM inventory WHERE tag = '' and objecttype = 2 ; ''')
|
||||||
with SqlBulkExecute() as sql:
|
with SqlBulkExecute() as sql:
|
||||||
for row in queryreturn:
|
for row in queryreturn:
|
||||||
hash01, payload = row
|
transmitdata, = row
|
||||||
readPosition = 16 # Nonce length + time length
|
data += json.dumps({'data':transmitdata.encode('hex')}, indent=4, separators=(',', ': '))
|
||||||
readPosition += decodeVarint(payload[readPosition:readPosition+10])[1] # Stream Number length
|
data += ']}'
|
||||||
t = (payload[readPosition:readPosition+32],hash01)
|
return data
|
||||||
sql.execute('''UPDATE inventory SET tag=? WHERE hash=?; ''', *t)
|
elif method == 'clientStatus':
|
||||||
|
if len(shared.connectedHostsList) == 0:
|
||||||
queryreturn = sqlQuery('''SELECT payload FROM inventory WHERE tag = ?''',
|
networkStatus = 'notConnected'
|
||||||
requestedHash)
|
elif len(shared.connectedHostsList) > 0 and not shared.clientHasReceivedIncomingConnections:
|
||||||
data = '{"receivedMessageDatas":['
|
networkStatus = 'connectedButHaveNotReceivedIncomingConnections'
|
||||||
for row in queryreturn:
|
else:
|
||||||
payload, = row
|
networkStatus = 'connectedAndReceivingIncomingConnections'
|
||||||
if len(data) > 25:
|
return json.dumps({'networkConnections':len(shared.connectedHostsList),'numberOfMessagesProcessed':shared.numberOfMessagesProcessed, 'numberOfBroadcastsProcessed':shared.numberOfBroadcastsProcessed, 'numberOfPubkeysProcessed':shared.numberOfPubkeysProcessed, 'networkStatus':networkStatus, 'softwareName':'PyBitmessage','softwareVersion':shared.softwareVersion}, indent=4, separators=(',', ': '))
|
||||||
data += ','
|
elif method == 'decodeAddress':
|
||||||
data += json.dumps({'data':payload.encode('hex')}, indent=4, separators=(',', ': '))
|
# Return a meaningful decoding of an address.
|
||||||
data += ']}'
|
if len(params) != 1:
|
||||||
return data
|
raise APIError(0, 'I need 1 parameter!')
|
||||||
|
address, = params
|
||||||
def HandleClientStatus(self, params):
|
status, addressVersion, streamNumber, ripe = decodeAddress(address)
|
||||||
if len(shared.connectedHostsList) == 0:
|
return json.dumps({'status':status, 'addressVersion':addressVersion,
|
||||||
networkStatus = 'notConnected'
|
'streamNumber':streamNumber, 'ripe':ripe.encode('base64')}, indent=4,
|
||||||
elif len(shared.connectedHostsList) > 0 and not shared.clientHasReceivedIncomingConnections:
|
separators=(',', ': '))
|
||||||
networkStatus = 'connectedButHaveNotReceivedIncomingConnections'
|
elif method == 'getInboxCount':
|
||||||
else:
|
#queryreturn = sqlQuery('''SELECT read, received < 'now' - 60 AS old, COUNT (*) AS cnt FROM inbox WHERE folder = 'inbox' GROUP BY read, old''')
|
||||||
networkStatus = 'connectedAndReceivingIncomingConnections'
|
ret = {}
|
||||||
return json.dumps({'networkConnections':len(shared.connectedHostsList),'numberOfMessagesProcessed':shared.numberOfMessagesProcessed, 'numberOfBroadcastsProcessed':shared.numberOfBroadcastsProcessed, 'numberOfPubkeysProcessed':shared.numberOfPubkeysProcessed, 'networkStatus':networkStatus, 'softwareName':'PyBitmessage','softwareVersion':shared.softwareVersion}, indent=4, separators=(',', ': '))
|
queryreturn = sqlQuery('''SELECT COUNT (*) AS cnt FROM inbox WHERE folder = 'inbox' AND read = 0 AND received < 'now' - 60''')
|
||||||
|
for row in queryreturn:
|
||||||
def HandleDecodeAddress(self, params):
|
count, = row
|
||||||
# Return a meaningful decoding of an address.
|
ret['oldread'] = count
|
||||||
if len(params) != 1:
|
queryreturn = sqlQuery('''SELECT COUNT (*) AS cnt FROM inbox WHERE folder = 'inbox' AND read = 1 AND received < 'now' - 60''')
|
||||||
raise APIError(0, 'I need 1 parameter!')
|
for row in queryreturn:
|
||||||
address, = params
|
count, = row
|
||||||
status, addressVersion, streamNumber, ripe = decodeAddress(address)
|
ret['oldunread'] = count
|
||||||
return json.dumps({'status':status, 'addressVersion':addressVersion,
|
queryreturn = sqlQuery('''SELECT COUNT (*) AS cnt FROM inbox WHERE folder = 'inbox' AND read = 0 AND received >= 'now' - 60''')
|
||||||
'streamNumber':streamNumber, 'ripe':ripe.encode('base64')}, indent=4,
|
for row in queryreturn:
|
||||||
separators=(',', ': '))
|
count, = row
|
||||||
|
ret['newread'] = count
|
||||||
def HandleHelloWorld(self, params):
|
queryreturn = sqlQuery('''SELECT COUNT (*) AS cnt FROM inbox WHERE folder = 'inbox' AND read = 1 AND received >= 'now' - 60''')
|
||||||
(a, b) = params
|
for row in queryreturn:
|
||||||
return a + '-' + b
|
count, = row
|
||||||
|
ret['newunread'] = count
|
||||||
def HandleAdd(self, params):
|
data = '{"inboxCount":{'
|
||||||
(a, b) = params
|
for key in ret:
|
||||||
return a + b
|
val = ret[key]
|
||||||
|
if len(data) > 16:
|
||||||
def HandleStatusBar(self, params):
|
data += ','
|
||||||
message, = params
|
data += json.dumps({key:val}, indent=4, separators=(',', ': '))
|
||||||
shared.UISignalQueue.put(('updateStatusBar', message))
|
data += '}}'
|
||||||
|
elif method == 'getSentCount':
|
||||||
|
ret = {}
|
||||||
handlers = {}
|
queryreturn = sqlQuery('''SELECT COUNT (*) AS cnt FROM sent WHERE folder = 'sent' AND status = 'msgqueued' ''')
|
||||||
handlers['helloWorld'] = HandleHelloWorld
|
for row in queryreturn:
|
||||||
handlers['add'] = HandleAdd
|
count, = row
|
||||||
handlers['statusBar'] = HandleStatusBar
|
ret['queued'] = count
|
||||||
handlers['listAddresses'] = HandleListAddresses
|
queryreturn = sqlQuery('''SELECT COUNT (*) AS cnt FROM sent WHERE folder = 'sent' AND status = 'msgsent' ''')
|
||||||
handlers['listAddressBookEntries'] = HandleListAddressBookEntries;
|
for row in queryreturn:
|
||||||
handlers['listAddressbook'] = HandleListAddressBookEntries # the listAddressbook alias should be removed eventually.
|
count, = row
|
||||||
handlers['addAddressBookEntry'] = HandleAddAddressBookEntry
|
ret['awaitingack'] = count
|
||||||
handlers['addAddressbook'] = HandleAddAddressBookEntry # the addAddressbook alias should be deleted eventually.
|
data = '{"sentCount":{'
|
||||||
handlers['deleteAddressBookEntry'] = HandleDeleteAddressBookEntry
|
for key in ret:
|
||||||
handlers['deleteAddressbook'] = HandleDeleteAddressBookEntry # The deleteAddressbook alias should be deleted eventually.
|
val = ret[key]
|
||||||
handlers['createRandomAddress'] = HandleCreateRandomAddress
|
if len(data) > 15:
|
||||||
handlers['createDeterministicAddresses'] = HandleCreateDeterministicAddresses
|
data += ','
|
||||||
handlers['getDeterministicAddress'] = HandleGetDeterministicAddress
|
data += json.dumps({key:val}, indent=4, separators=(',', ': '))
|
||||||
handlers['createChan'] = HandleCreateChan
|
data += '}}'
|
||||||
handlers['joinChan'] = HandleJoinChan
|
elif method == 'deleteAndVacuum':
|
||||||
handlers['leaveChan'] = HandleLeaveChan
|
sqlStoredProcedure('deleteandvacuume')
|
||||||
handlers['deleteAddress'] = HandleDeleteAddress
|
return 'done'
|
||||||
handlers['getAllInboxMessages'] = HandleGetAllInboxMessages
|
|
||||||
handlers['getAllInboxMessageIds'] = HandleGetAllInboxMessageIds
|
|
||||||
handlers['getAllInboxMessageIDs'] = HandleGetAllInboxMessageIds
|
|
||||||
handlers['getInboxMessageById'] = HandleGetInboxMessageById
|
|
||||||
handlers['getInboxMessageByID'] = HandleGetInboxMessageById
|
|
||||||
handlers['getAllSentMessages'] = HandleGetAllSentMessages
|
|
||||||
handlers['getAllSentMessageIds'] = HandleGetAllSentMessageIds
|
|
||||||
handlers['getAllSentMessageIDs'] = HandleGetAllSentMessageIds
|
|
||||||
handlers['getInboxMessagesByReceiver'] = HandleInboxMessagesByReceiver
|
|
||||||
handlers['getInboxMessagesByAddress'] = HandleInboxMessagesByReceiver #after some time getInboxMessagesByAddress should be removed
|
|
||||||
handlers['getSentMessageById'] = HandleGetSentMessageById
|
|
||||||
handlers['getSentMessageByID'] = HandleGetSentMessageById
|
|
||||||
handlers['getSentMessagesByAddress'] = HandleGetSentMessagesByAddress
|
|
||||||
handlers['getSentMessagesBySender'] = HandleGetSentMessagesByAddress
|
|
||||||
handlers['getSentMessageByAckData'] = HandleGetSentMessagesByAckData
|
|
||||||
handlers['trashMessage'] = HandleTrashMessage
|
|
||||||
handlers['trashInboxMessage'] = HandleTrashInboxMessage
|
|
||||||
handlers['trashSentMessage'] = HandleTrashSentMessage
|
|
||||||
handlers['trashSentMessageByAckData'] = HandleTrashSentMessageByAckDAta
|
|
||||||
handlers['sendMessage'] = HandleSendMessage
|
|
||||||
handlers['sendBroadcast'] = HandleSendBroadcast
|
|
||||||
handlers['getStatus'] = HandleGetStatus
|
|
||||||
handlers['addSubscription'] = HandleAddSubscription
|
|
||||||
handlers['deleteSubscription'] = HandleDeleteSubscription
|
|
||||||
handlers['listSubscriptions'] = ListSubscriptions
|
|
||||||
handlers['disseminatePreEncryptedMsg'] = HandleDisseminatePreEncryptedMsg
|
|
||||||
handlers['disseminatePubkey'] = HandleDissimatePubKey
|
|
||||||
handlers['getMessageDataByDestinationHash'] = HandleGetMessageDataByDestinationHash
|
|
||||||
handlers['getMessageDataByDestinationTag'] = HandleGetMessageDataByDestinationHash
|
|
||||||
handlers['clientStatus'] = HandleClientStatus
|
|
||||||
handlers['decodeAddress'] = HandleDecodeAddress
|
|
||||||
|
|
||||||
def _handle_request(self, method, params):
|
|
||||||
if (self.handlers.has_key(method)):
|
|
||||||
return self.handlers[method](self ,params)
|
|
||||||
else:
|
else:
|
||||||
raise APIError(20, 'Invalid method: %s' % method)
|
raise APIError(20, 'Invalid method: %s' % method)
|
||||||
|
|
||||||
|
|
|
@ -575,6 +575,46 @@ def genAdd(lbl,deterministic, passphrase, numOfAdd, addVNum, streamNum, ripe): #
|
||||||
else:
|
else:
|
||||||
return 'Entry Error'
|
return 'Entry Error'
|
||||||
|
|
||||||
|
def delMilAddr(): #Generate address
|
||||||
|
global usrPrompt
|
||||||
|
try:
|
||||||
|
response = api.listAddresses2()
|
||||||
|
# if api is too old just return then fail
|
||||||
|
if "API Error 0020" in response: return
|
||||||
|
addresses = json.loads(response)
|
||||||
|
for entry in addresses['addresses']:
|
||||||
|
if entry['label'].decode('base64')[:6] == "random":
|
||||||
|
api.deleteAddress(entry['address'])
|
||||||
|
except:
|
||||||
|
print '\n Connection Error\n'
|
||||||
|
usrPrompt = 0
|
||||||
|
main()
|
||||||
|
|
||||||
|
def genMilAddr(): #Generate address
|
||||||
|
global usrPrompt
|
||||||
|
maxn = 0
|
||||||
|
try:
|
||||||
|
response = api.listAddresses2()
|
||||||
|
if "API Error 0020" in response: return
|
||||||
|
addresses = json.loads(response)
|
||||||
|
for entry in addresses['addresses']:
|
||||||
|
if entry['label'].decode('base64')[:6] == "random":
|
||||||
|
newn = int(entry['label'].decode('base64')[6:])
|
||||||
|
if maxn < newn:
|
||||||
|
maxn = newn
|
||||||
|
except:
|
||||||
|
print "\n Some error\n"
|
||||||
|
print "\n Starting at " + str(maxn) + "\n"
|
||||||
|
for i in range(maxn, 10000):
|
||||||
|
lbl = "random" + str(i)
|
||||||
|
addressLabel = lbl.encode('base64')
|
||||||
|
try:
|
||||||
|
generatedAddress = api.createRandomAddress(addressLabel)
|
||||||
|
except:
|
||||||
|
print '\n Connection Error\n'
|
||||||
|
usrPrompt = 0
|
||||||
|
main()
|
||||||
|
|
||||||
def saveFile(fileName, fileData): #Allows attachments and messages/broadcats to be saved
|
def saveFile(fileName, fileData): #Allows attachments and messages/broadcats to be saved
|
||||||
|
|
||||||
#This section finds all invalid characters and replaces them with ~
|
#This section finds all invalid characters and replaces them with ~
|
||||||
|
@ -1249,6 +1289,19 @@ def markAllMessagesUnread():
|
||||||
if message['read']:
|
if message['read']:
|
||||||
markMessageUnread(message['msgid'])
|
markMessageUnread(message['msgid'])
|
||||||
|
|
||||||
|
def clientStatus():
|
||||||
|
try:
|
||||||
|
clientStatus = json.loads(api.clientStatus())
|
||||||
|
except:
|
||||||
|
print '\n Connection Error\n'
|
||||||
|
usrPrompt = 0
|
||||||
|
main()
|
||||||
|
print "\nnetworkStatus: " + clientStatus['networkStatus'] + "\n"
|
||||||
|
print "\nnetworkConnections: " + str(clientStatus['networkConnections']) + "\n"
|
||||||
|
print "\nnumberOfPubkeysProcessed: " + str(clientStatus['numberOfPubkeysProcessed']) + "\n"
|
||||||
|
print "\nnumberOfMessagesProcessed: " + str(clientStatus['numberOfMessagesProcessed']) + "\n"
|
||||||
|
print "\nnumberOfBroadcastsProcessed: " + str(clientStatus['numberOfBroadcastsProcessed']) + "\n"
|
||||||
|
|
||||||
|
|
||||||
def UI(usrInput): #Main user menu
|
def UI(usrInput): #Main user menu
|
||||||
global usrPrompt
|
global usrPrompt
|
||||||
|
@ -1665,6 +1718,21 @@ def UI(usrInput): #Main user menu
|
||||||
markAllMessagesUnread()
|
markAllMessagesUnread()
|
||||||
usrPrompt = 1
|
usrPrompt = 1
|
||||||
main()
|
main()
|
||||||
|
|
||||||
|
elif usrInput == "status":
|
||||||
|
clientStatus()
|
||||||
|
usrPrompt = 1
|
||||||
|
main()
|
||||||
|
|
||||||
|
elif usrInput == "million+":
|
||||||
|
genMilAddr()
|
||||||
|
usrPrompt = 1
|
||||||
|
main()
|
||||||
|
|
||||||
|
elif usrInput == "million-":
|
||||||
|
delMilAddr()
|
||||||
|
usrPrompt = 1
|
||||||
|
main()
|
||||||
|
|
||||||
else:
|
else:
|
||||||
print '\n "',usrInput,'" is not a command.\n'
|
print '\n "',usrInput,'" is not a command.\n'
|
||||||
|
|
|
@ -450,7 +450,7 @@ class sqlThread(threading.Thread):
|
||||||
queryreturn = self.cur.fetchall()
|
queryreturn = self.cur.fetchall()
|
||||||
for row in queryreturn:
|
for row in queryreturn:
|
||||||
value, = row
|
value, = row
|
||||||
if int(value) < int(time.time()) - 2592000:
|
if int(value) < int(time.time()) - 86400:
|
||||||
logger.info('It has been a long time since the messages.dat file has been vacuumed. Vacuuming now...')
|
logger.info('It has been a long time since the messages.dat file has been vacuumed. Vacuuming now...')
|
||||||
try:
|
try:
|
||||||
self.cur.execute( ''' VACUUM ''')
|
self.cur.execute( ''' VACUUM ''')
|
||||||
|
|
|
@ -2,6 +2,7 @@ import numpy
|
||||||
from struct import pack, unpack
|
from struct import pack, unpack
|
||||||
import time
|
import time
|
||||||
import hashlib
|
import hashlib
|
||||||
|
import random
|
||||||
import pyopencl as cl
|
import pyopencl as cl
|
||||||
|
|
||||||
hash_dt = numpy.dtype([('target', numpy.uint64), ('v', numpy.str_, 73)])
|
hash_dt = numpy.dtype([('target', numpy.uint64), ('v', numpy.str_, 73)])
|
||||||
|
@ -14,7 +15,7 @@ try:
|
||||||
ctx = cl.create_some_context()
|
ctx = cl.create_some_context()
|
||||||
queue = cl.CommandQueue(ctx)
|
queue = cl.CommandQueue(ctx)
|
||||||
|
|
||||||
f = open('kernel.cl', 'r')
|
f = open('/usr/src/PyBitmessage/src/kernel.cl', 'r')
|
||||||
fstr = ''.join(f.readlines())
|
fstr = ''.join(f.readlines())
|
||||||
program = cl.Program(ctx, fstr).build()
|
program = cl.Program(ctx, fstr).build()
|
||||||
except:
|
except:
|
||||||
|
@ -42,7 +43,10 @@ def do_opencl_pow(hash, target):
|
||||||
kernel.set_arg(1, dest_buf)
|
kernel.set_arg(1, dest_buf)
|
||||||
|
|
||||||
start = time.time()
|
start = time.time()
|
||||||
|
#startpos = random.getrandbits(32) << 32 | random.getrandbits(32)
|
||||||
|
#startpos = random.getrandbits(32)
|
||||||
startpos = 0
|
startpos = 0
|
||||||
|
progress = 0
|
||||||
globamt = worksize*2000
|
globamt = worksize*2000
|
||||||
|
|
||||||
while output[0][0] == 0:
|
while output[0][0] == 0:
|
||||||
|
@ -50,17 +54,19 @@ def do_opencl_pow(hash, target):
|
||||||
cl.enqueue_nd_range_kernel(queue, kernel, (globamt,), (worksize,))
|
cl.enqueue_nd_range_kernel(queue, kernel, (globamt,), (worksize,))
|
||||||
cl.enqueue_read_buffer(queue, dest_buf, output)
|
cl.enqueue_read_buffer(queue, dest_buf, output)
|
||||||
queue.finish()
|
queue.finish()
|
||||||
|
#startpos == (globamt + startpos) & 0xFFFFFFFFFFFFFFFF
|
||||||
startpos += globamt
|
startpos += globamt
|
||||||
|
progress += globamt
|
||||||
sofar = time.time() - start
|
sofar = time.time() - start
|
||||||
print sofar, startpos / sofar, "hashes/sec"
|
print sofar, progress / sofar, "hashes/sec"
|
||||||
taken = time.time() - start
|
taken = time.time() - start
|
||||||
print startpos, taken
|
print progress, taken
|
||||||
return output[0][0]
|
return output[0][0]
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
target = 54227212183L
|
target = 54227212183L
|
||||||
initialHash = "3758f55b5a8d902fd3597e4ce6a2d3f23daff735f65d9698c270987f4e67ad590b93f3ffeba0ef2fd08a8dc2f87b68ae5a0dc819ab57f22ad2c4c9c8618a43b3".decode("hex")
|
initialHash = "3758f55b5a8d902fd3597e4ce6a2d3f23daff735f65d9698c270987f4e67ad590b93f3ffeba0ef2fd08a8dc2f87b68ae5a0dc819ab57f22ad2c4c9c8618a43b3".decode("hex")
|
||||||
nonce = do_pow(initialHash.encode("hex"), target)
|
nonce = do_opencl_pow(initialHash.encode("hex"), target)
|
||||||
trialValue, = unpack('>Q',hashlib.sha512(hashlib.sha512(pack('>Q',nonce) + initialHash).digest()).digest()[0:8])
|
trialValue, = unpack('>Q',hashlib.sha512(hashlib.sha512(pack('>Q',nonce) + initialHash).digest()).digest()[0:8])
|
||||||
print "{} - value {} < {}".format(nonce, trialValue, target)
|
print "{} - value {} < {}".format(nonce, trialValue, target)
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ from struct import unpack, pack
|
||||||
import sys
|
import sys
|
||||||
from shared import config, frozen
|
from shared import config, frozen
|
||||||
import shared
|
import shared
|
||||||
from openclpow import do_opencl_pow
|
import openclpow
|
||||||
#import os
|
#import os
|
||||||
|
|
||||||
def _set_idle():
|
def _set_idle():
|
||||||
|
@ -33,6 +33,7 @@ def _pool_worker(nonce, initialHash, target, pool_size):
|
||||||
return [trialValue, nonce]
|
return [trialValue, nonce]
|
||||||
|
|
||||||
def _doSafePoW(target, initialHash):
|
def _doSafePoW(target, initialHash):
|
||||||
|
print "Safe POW\n"
|
||||||
nonce = 0
|
nonce = 0
|
||||||
trialValue = float('inf')
|
trialValue = float('inf')
|
||||||
while trialValue > target:
|
while trialValue > target:
|
||||||
|
@ -41,6 +42,7 @@ def _doSafePoW(target, initialHash):
|
||||||
return [trialValue, nonce]
|
return [trialValue, nonce]
|
||||||
|
|
||||||
def _doFastPoW(target, initialHash):
|
def _doFastPoW(target, initialHash):
|
||||||
|
print "Fast POW\n"
|
||||||
import time
|
import time
|
||||||
from multiprocessing import Pool, cpu_count
|
from multiprocessing import Pool, cpu_count
|
||||||
try:
|
try:
|
||||||
|
@ -72,13 +74,14 @@ def _doFastPoW(target, initialHash):
|
||||||
time.sleep(0.2)
|
time.sleep(0.2)
|
||||||
|
|
||||||
def _doGPUPow(target, initialHash):
|
def _doGPUPow(target, initialHash):
|
||||||
nonce = do_opencl_pow(initialHash.encode("hex"), target)
|
print "GPU POW\n"
|
||||||
|
nonce = openclpow.do_opencl_pow(initialHash.encode("hex"), target)
|
||||||
trialValue, = unpack('>Q',hashlib.sha512(hashlib.sha512(pack('>Q',nonce) + initialHash).digest()).digest()[0:8])
|
trialValue, = unpack('>Q',hashlib.sha512(hashlib.sha512(pack('>Q',nonce) + initialHash).digest()).digest()[0:8])
|
||||||
#print "{} - value {} < {}".format(nonce, trialValue, target)
|
#print "{} - value {} < {}".format(nonce, trialValue, target)
|
||||||
return [trialValue, nonce]
|
return [trialValue, nonce]
|
||||||
|
|
||||||
def run(target, initialHash):
|
def run(target, initialHash):
|
||||||
if has_opencl:
|
if openclpow.has_opencl():
|
||||||
return _doGPUPow(target, initialHash)
|
return _doGPUPow(target, initialHash)
|
||||||
elif frozen == "macosx_app" or not frozen:
|
elif frozen == "macosx_app" or not frozen:
|
||||||
return _doFastPoW(target, initialHash)
|
return _doFastPoW(target, initialHash)
|
||||||
|
|
Reference in New Issue
Block a user