Fix issue #804 #805
4
debian/control
vendored
4
debian/control
vendored
|
@ -2,14 +2,14 @@ Source: pybitmessage
|
|||
Section: mail
|
||||
Priority: extra
|
||||
Maintainer: Bob Mottram (4096 bits) <bob@robotics.uk.to>
|
||||
Build-Depends: debhelper (>= 9.0.0)
|
||||
Build-Depends: debhelper (>= 9.0.0), libqt4-dev (>= 4.8.0), python-qt4-dev, libsqlite3-dev
|
||||
Standards-Version: 3.9.4
|
||||
Homepage: https://github.com/Bitmessage/PyBitmessage
|
||||
Vcs-Git: https://github.com/Bitmessage/PyBitmessage.git
|
||||
|
||||
Package: pybitmessage
|
||||
Architecture: all
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}, ${python:Depends}, python (>= 2.7), openssl, python-qt4, libqt4-dev (>= 4.8.0), python-qt4-dev, sqlite3, libsqlite3-dev, gst123
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}, ${python:Depends}, python (>= 2.7), openssl, python-qt4, sqlite3, gst123
|
||||
Suggests: libmessaging-menu-dev
|
||||
Description: Send encrypted messages
|
||||
Bitmessage is a P2P communications protocol used to send encrypted
|
||||
|
|
324
src/api.py
324
src/api.py
|
@ -149,17 +149,10 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
|||
|
||||
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':
|
||||
|
||||
#Request Handlers
|
||||
|
||||
def HandleListAddresses(self, method):
|
||||
data = '{"addresses":['
|
||||
configSections = shared.config.sections()
|
||||
for addressInKeysFile in configSections:
|
||||
|
@ -179,7 +172,8 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
|||
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.
|
||||
|
||||
def HandleListAddressBookEntries(self, params):
|
||||
queryreturn = sqlQuery('''SELECT label, address from addressbook''')
|
||||
data = '{"addresses":['
|
||||
for row in queryreturn:
|
||||
|
@ -190,7 +184,8 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
|||
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.
|
||||
|
||||
def HandleAddAddressBookEntry(self, params):
|
||||
if len(params) != 2:
|
||||
raise APIError(0, "I need label and address")
|
||||
address, label = params
|
||||
|
@ -206,7 +201,8 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
|||
shared.UISignalQueue.put(('rerenderSentToLabels',''))
|
||||
shared.UISignalQueue.put(('rerenderAddressBook',''))
|
||||
return "Added address %s to address book" % address
|
||||
elif method == 'deleteAddressBookEntry' or method == 'deleteAddressbook': # The deleteAddressbook alias should be deleted eventually.
|
||||
|
||||
def HandleDeleteAddressBookEntry(self, params):
|
||||
if len(params) != 1:
|
||||
raise APIError(0, "I need an address")
|
||||
address, = params
|
||||
|
@ -217,7 +213,8 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
|||
shared.UISignalQueue.put(('rerenderSentToLabels',''))
|
||||
shared.UISignalQueue.put(('rerenderAddressBook',''))
|
||||
return "Deleted address book entry for %s if it existed" % address
|
||||
elif method == 'createRandomAddress':
|
||||
|
||||
def HandleCreateRandomAddress(self, params):
|
||||
if len(params) == 0:
|
||||
raise APIError(0, 'I need parameters!')
|
||||
elif len(params) == 1:
|
||||
|
@ -257,7 +254,8 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
|||
shared.addressGeneratorQueue.put((
|
||||
'createRandomAddress', 4, streamNumberForAddress, label, 1, "", eighteenByteRipe, nonceTrialsPerByte, payloadLengthExtraBytes))
|
||||
return shared.apiAddressGeneratorReturnQueue.get()
|
||||
elif method == 'createDeterministicAddresses':
|
||||
|
||||
def HandleCreateDeterministicAddresses(self, params):
|
||||
if len(params) == 0:
|
||||
raise APIError(0, 'I need parameters!')
|
||||
elif len(params) == 1:
|
||||
|
@ -344,7 +342,8 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
|||
data += "\"" + item + "\""
|
||||
data += ']}'
|
||||
return data
|
||||
elif method == 'getDeterministicAddress':
|
||||
|
||||
def HandleGetDeterministicAddress(self, params):
|
||||
if len(params) != 3:
|
||||
raise APIError(0, 'I need exactly 3 parameters.')
|
||||
passphrase, addressVersionNumber, streamNumber = params
|
||||
|
@ -364,7 +363,7 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
|||
streamNumber, 'unused API address', numberOfAddresses, passphrase, eighteenByteRipe))
|
||||
return shared.apiAddressGeneratorReturnQueue.get()
|
||||
|
||||
elif method == 'createChan':
|
||||
def HandleCreateChan(self, params):
|
||||
if len(params) == 0:
|
||||
raise APIError(0, 'I need parameters.')
|
||||
elif len(params) == 1:
|
||||
|
@ -390,7 +389,8 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
|||
raise APIError(24, 'Chan address is already present.')
|
||||
address = queueReturn[0]
|
||||
return address
|
||||
elif method == 'joinChan':
|
||||
|
||||
def HandleJoinChan(self, params):
|
||||
if len(params) < 2:
|
||||
raise APIError(0, 'I need two parameters.')
|
||||
elif len(params) == 2:
|
||||
|
@ -419,7 +419,8 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
|||
#TODO: this variable is not used to anything
|
||||
createdAddress = addressGeneratorReturnValue[0] # in case we ever want it for anything.
|
||||
return "success"
|
||||
elif method == 'leaveChan':
|
||||
|
||||
def HandleLeaveChan(self, params):
|
||||
if len(params) == 0:
|
||||
raise APIError(0, 'I need parameters.')
|
||||
elif len(params) == 1:
|
||||
|
@ -431,10 +432,11 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
|||
if not shared.safeConfigGetBoolean(address, 'chan'):
|
||||
raise APIError(25, 'Specified address is not a chan address. Use deleteAddress API call instead.')
|
||||
shared.config.remove_section(address)
|
||||
shared.writeKeysFile()
|
||||
with open(shared.appdata + 'keys.dat', 'wb') as configfile:
|
||||
shared.config.write(configfile)
|
||||
return 'success'
|
||||
|
||||
elif method == 'deleteAddress':
|
||||
def HandleDeleteAddress(self, params):
|
||||
if len(params) == 0:
|
||||
raise APIError(0, 'I need parameters.')
|
||||
elif len(params) == 1:
|
||||
|
@ -444,13 +446,14 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
|||
if not shared.config.has_section(address):
|
||||
raise APIError(13, 'Could not find this address in your keys.dat file.')
|
||||
shared.config.remove_section(address)
|
||||
shared.writeKeysFile()
|
||||
with open(shared.appdata + 'keys.dat', 'wb') as configfile:
|
||||
shared.config.write(configfile)
|
||||
shared.UISignalQueue.put(('rerenderInboxFromLabels',''))
|
||||
shared.UISignalQueue.put(('rerenderSentToLabels',''))
|
||||
shared.reloadMyAddressHashes()
|
||||
return 'success'
|
||||
|
||||
elif method == 'getAllInboxMessages':
|
||||
def HandleGetAllInboxMessages(self, params):
|
||||
queryreturn = sqlQuery(
|
||||
'''SELECT msgid, toaddress, fromaddress, subject, received, message, encodingtype, read FROM inbox where folder='inbox' ORDER BY received''')
|
||||
data = '{"inboxMessages":['
|
||||
|
@ -464,7 +467,8 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
|||
'base64'), 'message': message.encode('base64'), 'encodingType': encodingtype, 'receivedTime': received, 'read': read}, indent=4, separators=(',', ': '))
|
||||
data += ']}'
|
||||
return data
|
||||
elif method == 'getAllInboxMessageIds' or method == 'getAllInboxMessageIDs':
|
||||
|
||||
def HandleGetAllInboxMessageIds(self, params):
|
||||
queryreturn = sqlQuery(
|
||||
'''SELECT msgid FROM inbox where folder='inbox' ORDER BY received''')
|
||||
data = '{"inboxMessageIds":['
|
||||
|
@ -475,7 +479,8 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
|||
data += json.dumps({'msgid': msgid.encode('hex')}, indent=4, separators=(',', ': '))
|
||||
data += ']}'
|
||||
return data
|
||||
elif method == 'getInboxMessageById' or method == 'getInboxMessageByID':
|
||||
|
||||
def HandleGetInboxMessageById(self, params):
|
||||
if len(params) == 0:
|
||||
raise APIError(0, 'I need parameters!')
|
||||
elif len(params) == 1:
|
||||
|
@ -499,7 +504,8 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
|||
data += json.dumps({'msgid':msgid.encode('hex'), 'toAddress':toAddress, 'fromAddress':fromAddress, 'subject':subject.encode('base64'), 'message':message.encode('base64'), 'encodingType':encodingtype, 'receivedTime':received, 'read': read}, indent=4, separators=(',', ': '))
|
||||
data += ']}'
|
||||
return data
|
||||
elif method == 'getAllSentMessages':
|
||||
|
||||
def HandleGetAllSentMessages(self, params):
|
||||
queryreturn = sqlQuery('''SELECT msgid, toaddress, fromaddress, subject, lastactiontime, message, encodingtype, status, ackdata FROM sent where folder='sent' ORDER BY lastactiontime''')
|
||||
data = '{"sentMessages":['
|
||||
for row in queryreturn:
|
||||
|
@ -511,7 +517,8 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
|||
data += json.dumps({'msgid':msgid.encode('hex'), 'toAddress':toAddress, 'fromAddress':fromAddress, 'subject':subject.encode('base64'), 'message':message.encode('base64'), 'encodingType':encodingtype, 'lastActionTime':lastactiontime, 'status':status, 'ackData':ackdata.encode('hex')}, indent=4, separators=(',', ': '))
|
||||
data += ']}'
|
||||
return data
|
||||
elif method == 'getAllSentMessageIds' or method == 'getAllSentMessageIDs':
|
||||
|
||||
def HandleGetAllSentMessageIds(self, params):
|
||||
queryreturn = sqlQuery('''SELECT msgid FROM sent where folder='sent' ORDER BY lastactiontime''')
|
||||
data = '{"sentMessageIds":['
|
||||
for row in queryreturn:
|
||||
|
@ -521,7 +528,8 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
|||
data += json.dumps({'msgid':msgid.encode('hex')}, indent=4, separators=(',', ': '))
|
||||
data += ']}'
|
||||
return data
|
||||
elif method == 'getInboxMessagesByReceiver' or method == 'getInboxMessagesByAddress': #after some time getInboxMessagesByAddress should be removed
|
||||
|
||||
def HandleInboxMessagesByReceiver(self, params):
|
||||
if len(params) == 0:
|
||||
raise APIError(0, 'I need parameters!')
|
||||
toAddress = params[0]
|
||||
|
@ -536,7 +544,8 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
|||
data += json.dumps({'msgid':msgid.encode('hex'), 'toAddress':toAddress, 'fromAddress':fromAddress, 'subject':subject.encode('base64'), 'message':message.encode('base64'), 'encodingType':encodingtype, 'receivedTime':received}, indent=4, separators=(',', ': '))
|
||||
data += ']}'
|
||||
return data
|
||||
elif method == 'getSentMessageById' or method == 'getSentMessageByID':
|
||||
|
||||
def HandleGetSentMessageById(self, params):
|
||||
if len(params) == 0:
|
||||
raise APIError(0, 'I need parameters!')
|
||||
msgid = self._decode(params[0], "hex")
|
||||
|
@ -549,7 +558,8 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
|||
data += json.dumps({'msgid':msgid.encode('hex'), 'toAddress':toAddress, 'fromAddress':fromAddress, 'subject':subject.encode('base64'), 'message':message.encode('base64'), 'encodingType':encodingtype, 'lastActionTime':lastactiontime, 'status':status, 'ackData':ackdata.encode('hex')}, indent=4, separators=(',', ': '))
|
||||
data += ']}'
|
||||
return data
|
||||
elif method == 'getSentMessagesByAddress' or method == 'getSentMessagesBySender':
|
||||
|
||||
def HandleGetSentMessagesByAddress(self, params):
|
||||
if len(params) == 0:
|
||||
raise APIError(0, 'I need parameters!')
|
||||
fromAddress = params[0]
|
||||
|
@ -565,7 +575,8 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
|||
data += json.dumps({'msgid':msgid.encode('hex'), 'toAddress':toAddress, 'fromAddress':fromAddress, 'subject':subject.encode('base64'), 'message':message.encode('base64'), 'encodingType':encodingtype, 'lastActionTime':lastactiontime, 'status':status, 'ackData':ackdata.encode('hex')}, indent=4, separators=(',', ': '))
|
||||
data += ']}'
|
||||
return data
|
||||
elif method == 'getSentMessageByAckData':
|
||||
|
||||
def HandleGetSentMessagesByAckData(self, params):
|
||||
if len(params) == 0:
|
||||
raise APIError(0, 'I need parameters!')
|
||||
ackData = self._decode(params[0], "hex")
|
||||
|
@ -579,7 +590,8 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
|||
data += json.dumps({'msgid':msgid.encode('hex'), 'toAddress':toAddress, 'fromAddress':fromAddress, 'subject':subject.encode('base64'), 'message':message.encode('base64'), 'encodingType':encodingtype, 'lastActionTime':lastactiontime, 'status':status, 'ackData':ackdata.encode('hex')}, indent=4, separators=(',', ': '))
|
||||
data += ']}'
|
||||
return data
|
||||
elif method == 'trashMessage':
|
||||
|
||||
def HandleTrashMessage(self, params):
|
||||
if len(params) == 0:
|
||||
raise APIError(0, 'I need parameters!')
|
||||
msgid = self._decode(params[0], "hex")
|
||||
|
@ -589,48 +601,35 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
|||
# Trash if in sent table
|
||||
sqlExecute('''UPDATE sent SET folder='trash' WHERE msgid=?''', msgid)
|
||||
return 'Trashed message (assuming message existed).'
|
||||
elif method == 'trashInboxMessage':
|
||||
|
||||
def HandleTrashInboxMessage(self, params):
|
||||
if len(params) == 0:
|
||||
raise APIError(0, 'I need parameters!')
|
||||
msgid = self._decode(params[0], "hex")
|
||||
helper_inbox.trash(msgid)
|
||||
return 'Trashed inbox message (assuming message existed).'
|
||||
elif method == 'trashSentMessage':
|
||||
|
||||
def HandleTrashSentMessage(self, params):
|
||||
if len(params) == 0:
|
||||
raise APIError(0, 'I need parameters!')
|
||||
msgid = self._decode(params[0], "hex")
|
||||
sqlExecute('''UPDATE sent SET folder='trash' WHERE msgid=?''', msgid)
|
||||
return 'Trashed sent message (assuming message existed).'
|
||||
elif method == 'trashSentMessageByAckData':
|
||||
# This API method should only be used when msgid is not available
|
||||
if len(params) == 0:
|
||||
raise APIError(0, 'I need parameters!')
|
||||
ackdata = self._decode(params[0], "hex")
|
||||
sqlExecute('''UPDATE sent SET folder='trash' WHERE ackdata=?''',
|
||||
ackdata)
|
||||
return 'Trashed sent message (assuming message existed).'
|
||||
elif method == 'sendMessage':
|
||||
|
||||
def HandleSendMessage(self, params):
|
||||
if len(params) == 0:
|
||||
raise APIError(0, 'I need parameters!')
|
||||
elif len(params) == 4:
|
||||
toAddress, fromAddress, subject, message = params
|
||||
encodingType = 2
|
||||
TTL = 4*24*60*60
|
||||
elif len(params) == 5:
|
||||
toAddress, fromAddress, subject, message, encodingType = params
|
||||
TTL = 4*24*60*60
|
||||
elif len(params) == 6:
|
||||
toAddress, fromAddress, subject, message, encodingType, TTL = params
|
||||
if encodingType != 2:
|
||||
raise APIError(6, 'The encoding type must be 2 because that is the only one this program currently supports.')
|
||||
subject = self._decode(subject, "base64")
|
||||
message = self._decode(message, "base64")
|
||||
if len(subject + message) > (2 ** 18 - 500):
|
||||
raise APIError(27, 'Message is too long.')
|
||||
if TTL < 60*60:
|
||||
TTL = 60*60
|
||||
if TTL > 28*24*60*60:
|
||||
TTL = 28*24*60*60
|
||||
toAddress = addBMIfNotPresent(toAddress)
|
||||
fromAddress = addBMIfNotPresent(fromAddress)
|
||||
status, addressVersionNumber, streamNumber, toRipe = self._verifyAddress(toAddress)
|
||||
|
@ -645,21 +644,8 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
|||
|
||||
ackdata = OpenSSL.rand(32)
|
||||
|
||||
t = ('',
|
||||
toAddress,
|
||||
toRipe,
|
||||
fromAddress,
|
||||
subject,
|
||||
message,
|
||||
ackdata,
|
||||
int(time.time()), # sentTime (this won't change)
|
||||
int(time.time()), # lastActionTime
|
||||
0,
|
||||
'msgqueued',
|
||||
0,
|
||||
'sent',
|
||||
2,
|
||||
TTL)
|
||||
t = ('', toAddress, toRipe, fromAddress, subject, message, ackdata, int(
|
||||
time.time()), 'msgqueued', 1, 1, 'sent', 2)
|
||||
helper_sent.insert(t)
|
||||
|
||||
toLabel = ''
|
||||
|
@ -675,28 +661,20 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
|||
|
||||
return ackdata.encode('hex')
|
||||
|
||||
elif method == 'sendBroadcast':
|
||||
def HandleSendBroadcast(self, params):
|
||||
if len(params) == 0:
|
||||
raise APIError(0, 'I need parameters!')
|
||||
if len(params) == 3:
|
||||
fromAddress, subject, message = params
|
||||
encodingType = 2
|
||||
TTL = 4*24*60*60
|
||||
elif len(params) == 4:
|
||||
fromAddress, subject, message, encodingType = params
|
||||
TTL = 4*24*60*60
|
||||
elif len(params) == 5:
|
||||
fromAddress, subject, message, encodingType, TTL = params
|
||||
if encodingType != 2:
|
||||
raise APIError(6, 'The encoding type must be 2 because that is the only one this program currently supports.')
|
||||
subject = self._decode(subject, "base64")
|
||||
message = self._decode(message, "base64")
|
||||
if len(subject + message) > (2 ** 18 - 500):
|
||||
raise APIError(27, 'Message is too long.')
|
||||
if TTL < 60*60:
|
||||
TTL = 60*60
|
||||
if TTL > 28*24*60*60:
|
||||
TTL = 28*24*60*60
|
||||
fromAddress = addBMIfNotPresent(fromAddress)
|
||||
self._verifyAddress(fromAddress)
|
||||
try:
|
||||
|
@ -708,21 +686,9 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
|||
toAddress = '[Broadcast subscribers]'
|
||||
ripe = ''
|
||||
|
||||
t = ('',
|
||||
toAddress,
|
||||
ripe,
|
||||
fromAddress,
|
||||
subject,
|
||||
message,
|
||||
ackdata,
|
||||
int(time.time()), # sentTime (this doesn't change)
|
||||
int(time.time()), # lastActionTime
|
||||
0,
|
||||
'broadcastqueued',
|
||||
0,
|
||||
'sent',
|
||||
2,
|
||||
TTL)
|
||||
|
||||
t = ('', toAddress, ripe, fromAddress, subject, message, ackdata, int(
|
||||
time.time()), 'broadcastqueued', 1, 1, 'sent', 2)
|
||||
helper_sent.insert(t)
|
||||
|
||||
toLabel = '[Broadcast subscribers]'
|
||||
|
@ -731,7 +697,8 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
|||
shared.workerQueue.put(('sendbroadcast', ''))
|
||||
|
||||
return ackdata.encode('hex')
|
||||
elif method == 'getStatus':
|
||||
|
||||
def HandleGetStatus(self, params):
|
||||
if len(params) != 1:
|
||||
raise APIError(0, 'I need one parameter!')
|
||||
ackdata, = params
|
||||
|
@ -746,7 +713,8 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
|||
for row in queryreturn:
|
||||
status, = row
|
||||
return status
|
||||
elif method == 'addSubscription':
|
||||
|
||||
def HandleAddSubscription(self, params):
|
||||
if len(params) == 0:
|
||||
raise APIError(0, 'I need parameters!')
|
||||
if len(params) == 1:
|
||||
|
@ -774,62 +742,7 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
|||
shared.UISignalQueue.put(('rerenderSubscriptions', ''))
|
||||
return 'Added subscription.'
|
||||
|
||||
elif method == 'addAddressToBlackWhiteList':
|
||||
if len(params) == 0:
|
||||
raise APIError(0, 'I need parameters!')
|
||||
if len(params) == 1:
|
||||
address, = params
|
||||
label = ''
|
||||
if len(params) == 2:
|
||||
address, label = params
|
||||
label = self._decode(label, "base64")
|
||||
try:
|
||||
unicode(label, 'utf-8')
|
||||
except:
|
||||
raise APIError(17, 'Label is not valid UTF-8 data.')
|
||||
if len(params) > 2:
|
||||
raise APIError(0, 'I need either 1 or 2 parameters!')
|
||||
address = addBMIfNotPresent(address)
|
||||
self._verifyAddress(address)
|
||||
|
||||
table = ''
|
||||
if shared.config.get('bitmessagesettings', 'blackwhitelist') == 'black':
|
||||
table = 'blacklist'
|
||||
else:
|
||||
table = 'whitelist'
|
||||
|
||||
# First we must check to see if the address is already in the
|
||||
# black-/white-list.
|
||||
queryreturn = sqlQuery('''select * from '''+table+''' where address=?''', address)
|
||||
if queryreturn != []:
|
||||
raise APIError(28, 'You have already black-/white-listed that address.')
|
||||
sqlExecute('''INSERT INTO '''+table+''' VALUES (?,?,?)''',label, address, True)
|
||||
shared.UISignalQueue.put(('rerenderBlackWhiteList', ''))
|
||||
return 'Added black-/white-list entry.'
|
||||
|
||||
elif method == 'removeAddressFromBlackWhiteList':
|
||||
if len(params) != 1:
|
||||
raise APIError(0, 'I need 1 parameter!')
|
||||
address, = params
|
||||
address = addBMIfNotPresent(address)
|
||||
|
||||
table = ''
|
||||
if shared.config.get('bitmessagesettings', 'blackwhitelist') == 'black':
|
||||
table = 'blacklist'
|
||||
else:
|
||||
table = 'whitelist'
|
||||
|
||||
# First we must check to see if the address is already in the
|
||||
# black-/white-list.
|
||||
queryreturn = sqlQuery('''select * from '''+table+''' where address=?''', address)
|
||||
if queryreturn == []:
|
||||
raise APIError(29, 'That entry does not exist in the black-/white-list.')
|
||||
|
||||
sqlExecute('''DELETE FROM '''+table+''' WHERE address=?''', address)
|
||||
shared.UISignalQueue.put(('rerenderBlackWhiteList', ''))
|
||||
return 'Deleted black-/white-list entry if it existed.'
|
||||
|
||||
elif method == 'deleteSubscription':
|
||||
def HandleDeleteSubscription(self, params):
|
||||
if len(params) != 1:
|
||||
raise APIError(0, 'I need 1 parameter!')
|
||||
address, = params
|
||||
|
@ -839,7 +752,8 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
|||
shared.UISignalQueue.put(('rerenderInboxFromLabels', ''))
|
||||
shared.UISignalQueue.put(('rerenderSubscriptions', ''))
|
||||
return 'Deleted subscription if it existed.'
|
||||
elif method == 'listSubscriptions':
|
||||
|
||||
def ListSubscriptions(self, params):
|
||||
queryreturn = sqlQuery('''SELECT label, address, enabled FROM subscriptions''')
|
||||
data = '{"subscriptions":['
|
||||
for row in queryreturn:
|
||||
|
@ -850,7 +764,8 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
|||
data += json.dumps({'label':label.encode('base64'), 'address': address, 'enabled': enabled == 1}, indent=4, separators=(',',': '))
|
||||
data += ']}'
|
||||
return data
|
||||
elif method == 'disseminatePreEncryptedMsg':
|
||||
|
||||
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
|
||||
|
@ -885,7 +800,16 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
|||
print 'Broadcasting inv for msg(API disseminatePreEncryptedMsg command):', inventoryHash.encode('hex')
|
||||
shared.broadcastToSendDataQueues((
|
||||
toStreamNumber, 'advertiseobject', inventoryHash))
|
||||
elif method == 'disseminatePubkey':
|
||||
|
||||
def HandleTrashSentMessageByAckDAta(self, params):
|
||||
# This API method should only be used when msgid is not available
|
||||
if len(params) == 0:
|
||||
raise APIError(0, 'I need parameters!')
|
||||
ackdata = self._decode(params[0], "hex")
|
||||
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
|
||||
|
@ -924,11 +848,11 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
|||
print 'broadcasting inv within API command disseminatePubkey with hash:', inventoryHash.encode('hex')
|
||||
shared.broadcastToSendDataQueues((
|
||||
streamNumber, 'advertiseobject', inventoryHash))
|
||||
elif method == 'getMessageDataByDestinationHash' or method == 'getMessageDataByDestinationTag':
|
||||
|
||||
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
|
||||
|
@ -959,7 +883,25 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
|||
data += json.dumps({'data':payload.encode('hex')}, indent=4, separators=(',', ': '))
|
||||
data += ']}'
|
||||
return data
|
||||
elif method == 'clientStatus':
|
||||
|
||||
def HandleGetPubKeyByHash(self, params):
|
||||
# Method will eventually be used by a particular Android app to
|
||||
# retrieve pubkeys. Please do not yet add this to the api docs.
|
||||
if len(params) != 1:
|
||||
raise APIError(0, 'I need 1 parameter!')
|
||||
requestedHash, = params
|
||||
if len(requestedHash) != 40:
|
||||
raise APIError(19, 'The length of hash should be 20 bytes (encoded in hex thus 40 characters).')
|
||||
requestedHash = self._decode(requestedHash, "hex")
|
||||
queryreturn = sqlQuery('''SELECT transmitdata FROM pubkeys WHERE hash = ? ; ''', requestedHash)
|
||||
data = '{"pubkey":['
|
||||
for row in queryreturn:
|
||||
transmitdata, = row
|
||||
data += json.dumps({'data':transmitdata.encode('hex')}, indent=4, separators=(',', ': '))
|
||||
data += ']}'
|
||||
return data
|
||||
|
||||
def HandleClientStatus(self, params):
|
||||
if len(shared.connectedHostsList) == 0:
|
||||
networkStatus = 'notConnected'
|
||||
elif len(shared.connectedHostsList) > 0 and not shared.clientHasReceivedIncomingConnections:
|
||||
|
@ -967,7 +909,8 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
|||
else:
|
||||
networkStatus = 'connectedAndReceivingIncomingConnections'
|
||||
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=(',', ': '))
|
||||
elif method == 'decodeAddress':
|
||||
|
||||
def HandleDecodeAddress(self, params):
|
||||
# Return a meaningful decoding of an address.
|
||||
if len(params) != 1:
|
||||
raise APIError(0, 'I need 1 parameter!')
|
||||
|
@ -976,6 +919,74 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
|||
return json.dumps({'status':status, 'addressVersion':addressVersion,
|
||||
'streamNumber':streamNumber, 'ripe':ripe.encode('base64')}, indent=4,
|
||||
separators=(',', ': '))
|
||||
|
||||
def HandleHelloWorld(self, params):
|
||||
(a, b) = params
|
||||
return a + '-' + b
|
||||
|
||||
def HandleAdd(self, params):
|
||||
(a, b) = params
|
||||
return a + b
|
||||
|
||||
def HandleStatusBar(self, params):
|
||||
message, = params
|
||||
shared.UISignalQueue.put(('updateStatusBar', message))
|
||||
|
||||
|
||||
handlers = {}
|
||||
handlers['helloWorld'] = HandleHelloWorld
|
||||
handlers['add'] = HandleAdd
|
||||
handlers['statusBar'] = HandleStatusBar
|
||||
handlers['listAddresses'] = HandleListAddresses
|
||||
handlers['listAddressBookEntries'] = HandleListAddressBookEntries;
|
||||
handlers['listAddressbook'] = HandleListAddressBookEntries # the listAddressbook alias should be removed eventually.
|
||||
handlers['addAddressBookEntry'] = HandleAddAddressBookEntry
|
||||
handlers['addAddressbook'] = HandleAddAddressBookEntry # the addAddressbook alias should be deleted eventually.
|
||||
handlers['deleteAddressBookEntry'] = HandleDeleteAddressBookEntry
|
||||
handlers['deleteAddressbook'] = HandleDeleteAddressBookEntry # The deleteAddressbook alias should be deleted eventually.
|
||||
handlers['createRandomAddress'] = HandleCreateRandomAddress
|
||||
handlers['createDeterministicAddresses'] = HandleCreateDeterministicAddresses
|
||||
handlers['getDeterministicAddress'] = HandleGetDeterministicAddress
|
||||
handlers['createChan'] = HandleCreateChan
|
||||
handlers['joinChan'] = HandleJoinChan
|
||||
handlers['leaveChan'] = HandleLeaveChan
|
||||
handlers['deleteAddress'] = HandleDeleteAddress
|
||||
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['getPubkeyByHash'] = HandleGetPubKeyByHash
|
||||
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:
|
||||
raise APIError(20, 'Invalid method: %s' % method)
|
||||
|
||||
|
@ -997,4 +1008,3 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
|||
except Exception as e:
|
||||
logger.exception(e)
|
||||
return "API Error 0021: Unexpected API Failure - %s" % str(e)
|
||||
|
||||
|
|
|
@ -1229,7 +1229,7 @@ Die Zufallszahlen-Option ist standard, jedoch haben deterministische Adressen ei
|
|||
<message>
|
||||
<location filename="../bitmessageqt/about.py" line="71"/>
|
||||
<source>This is Beta software.</source>
|
||||
<translation>Diese ist Beta-Software.</translation>
|
||||
<translation>Dies ist Beta-Software.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../bitmessageqt/about.py" line="69"/>
|
||||
|
@ -1697,7 +1697,7 @@ Die Zufallszahlen-Option ist standard, jedoch haben deterministische Adressen ei
|
|||
<message>
|
||||
<location filename="../bitmessageqt/settings.py" line="439"/>
|
||||
<source><html><head/><body><p>By default, if you send a message to someone and he is offline for more than two days, Bitmessage will send the message again after an additional two days. This will be continued with exponential backoff forever; messages will be resent after 5, 10, 20 days ect. until the receiver acknowledges them. Here you may change that behavior by having Bitmessage give up after a certain number of days or months.</p><p>Leave these input fields blank for the default behavior. </p></body></html></source>
|
||||
<translation type="unfinished"><html><head/><body><p>Wurde eine Nachricht innerhalb von zwei Tagen nicht bestätigt, wird sie in zwei Tag noch einmal gesendet. Schlägt dies wieder fehl, wird es in 5, dann in 10, dann in 20 usw. Tagen wieder versucht. Sendet der Empfänger keine Bestätigung, geht dies unendlich so weiter.</p><p>Dieses Verhalten kann hier begrenz werden.</p></body></html></translation>
|
||||
<translation type="unfinished"><html><head/><body><p>Wurde eine Nachricht innerhalb von zwei Tagen nicht bestätigt, wird sie in zwei Tagen noch einmal gesendet. Schlägt dies wieder fehl, wird es in 5, dann in 10, dann in 20 usw. Tagen wieder versucht. Sendet der Empfänger keine Bestätigung, geht dies unendlich so weiter.</p><p>Dieses Verhalten kann hier begrenzt werden.</p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../bitmessageqt/settings.py" line="440"/>
|
||||
|
|
Reference in New Issue
Block a user