diff --git a/src/addresses.py b/src/addresses.py index 50602c5a..e58d06de 100644 --- a/src/addresses.py +++ b/src/addresses.py @@ -2,7 +2,6 @@ Operations with addresses """ # pylint: disable=redefined-outer-name,inconsistent-return-statements - import hashlib from binascii import hexlify, unhexlify from struct import pack, unpack @@ -46,7 +45,8 @@ def decodeBase58(string, alphabet=ALPHABET): for char in string: num *= base num += alphabet.index(char) - except: # ValueError + # ValueError + except: # character not found (like a space character or a 0) return 0 return num @@ -85,13 +85,13 @@ def decodeVarint(data): the minimum amount of data possible or else it is malformed. Returns a tuple: (theEncodedValue, theSizeOfTheVarintInBytes) """ - if not data: return (0, 0) firstByte, = unpack('>B', data[0:1]) if firstByte < 253: # encodes 0 to 252 - return (firstByte, 1) # the 1 is the length of the varint + # the 1 is the length of the varint + return (firstByte, 1) if firstByte == 253: # encodes 253 to 65535 if len(data) < 3: @@ -180,7 +180,8 @@ def decodeAddress(address): returns (status, address version number, stream number, data (almost certainly a ripe hash)) """ - # pylint: disable=too-many-return-statements,too-many-statements,too-many-return-statements,too-many-branches + # pylint: disable=too-many-return-statements,too-many-statements + # pylint: disable=too-many-branches address = str(address).strip() if address[:3] == 'BM-': @@ -237,7 +238,8 @@ def decodeAddress(address): status = 'success' if addressVersionNumber == 1: return status, addressVersionNumber, streamNumber, data[-24:-4] - elif addressVersionNumber == 2 or addressVersionNumber == 3: + # elif addressVersionNumber == 2 or addressVersionNumber == 3: + elif addressVersionNumber in (2, 3): embeddedRipeData = \ data[bytesUsedByVersionNumber + bytesUsedByStreamNumber:-4] if len(embeddedRipeData) == 19: diff --git a/src/api.py b/src/api.py index 3201fba5..bfbe45fa 100644 --- a/src/api.py +++ b/src/api.py @@ -1,15 +1,12 @@ -# pylint: disable=too-many-locals,too-many-lines,no-self-use,too-many-public-methods,too-many-branches -# pylint: disable=too-many-statements - -# Copyright (c) 2012-2016 Jonathan Warren -# Copyright (c) 2012-2020 The Bitmessage developers - """ This is not what you run to run the Bitmessage API. Instead, enable the API ( https://bitmessage.org/wiki/API ) and optionally enable daemon mode ( https://bitmessage.org/wiki/Daemon ) then run bitmessagemain.py. """ - +# pylint: disable=too-many-locals,too-many-lines,no-self-use,unused-argument +# pylint: disable=too-many-statements,too-many-public-methods,too-many-branches +# Copyright (c) 2012-2016 Jonathan Warren +# Copyright (c) 2012-2019 The Bitmessage developers import base64 import errno import hashlib @@ -33,13 +30,15 @@ import queues import shared import shutdown import state -from addresses import addBMIfNotPresent, calculateInventoryHash, decodeAddress, decodeVarint, varintDecodeError + +from addresses import addBMIfNotPresent, calculateInventoryHash, decodeAddress, decodeVarint, varintDecodeError from bmconfigparser import BMConfigParser from debug import logger from helper_ackPayload import genAckPayload from helper_sql import SqlBulkExecute, sqlExecute, sqlQuery, sqlStoredProcedure from inventory import Inventory from network.threads import StoppableThread +# pylint: disable=unused-variable str_chan = '[chan]' @@ -58,6 +57,7 @@ class APIError(Exception): class StoppableXMLRPCServer(SimpleXMLRPCServer): """A SimpleXMLRPCServer that honours state.shutdown""" + # pylint:disable=too-few-public-methods allow_reuse_address = True def serve_forever(self): @@ -150,7 +150,6 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): Note: this method is the same as in SimpleXMLRPCRequestHandler, just hacked to handle cookies """ - # Check that the path is legal if not self.is_rpc_path_valid(): self.report_404() @@ -175,10 +174,12 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): # SimpleXMLRPCDispatcher. To maintain backwards compatibility, # check to see if a subclass implements _dispatch and dispatch # using that method if present. - response = self.server._marshaled_dispatch( # pylint: disable=protected-access + # pylint: disable=protected-access + response = self.server._marshaled_dispatch( data, getattr(self, '_dispatch', None) ) - except BaseException: # This should only happen if the module is buggy + # This should only happen if the module is buggy + except BaseException: # internal error, report as HTTP server error self.send_response(500) self.end_headers() @@ -251,7 +252,8 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): if status == 'invalidcharacters': raise APIError(9, 'Invalid characters in address: ' + address) if status == 'versiontoohigh': - raise APIError(10, 'Address version number too high (or zero) in address: ' + address) + raise APIError( + 10, 'Address version number too high (or zero) in address: ' + address) if status == 'varintmalformed': raise APIError(26, 'Malformed varint in address: ' + address) raise APIError(7, 'Could not decode address: %s : %s' % (address, status)) @@ -275,7 +277,7 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): data = '{"addresses":[' for addressInKeysFile in BMConfigParser().addresses(): - status, addressVersionNumber, streamNumber, hash01 = decodeAddress( # pylint: disable=unused-variable + status, addressVersionNumber, streamNumber, hash01 = decodeAddress( addressInKeysFile) if len(data) > 20: data += ',' @@ -485,7 +487,8 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): # 0 means "just use the proper addressVersionNumber" if addressVersionNumber == 0: addressVersionNumber = 4 - if addressVersionNumber != 3 and addressVersionNumber != 4: + # if addressVersionNumber != 3 and addressVersionNumber != 4: + if addressVersionNumber not in (3, 4): raise APIError( 2, 'The address version number currently must be 3, 4, or 0' ' (which means auto-select). %i isn\'t supported.' % @@ -536,7 +539,8 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): if not passphrase: raise APIError(1, 'The specified passphrase is blank.') passphrase = self._decode(passphrase, "base64") - if addressVersionNumber != 3 and addressVersionNumber != 4: + # if addressVersionNumber != 3 and addressVersionNumber != 4: + if addressVersionNumber not in (3, 4): raise APIError( 2, 'The address version number currently must be 3 or 4. %i' ' isn\'t supported.' % addressVersionNumber) @@ -606,8 +610,7 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): label = str_chan + ' ' + passphrase except BaseException: label = str_chan + ' ' + repr(passphrase) - - status, addressVersionNumber, streamNumber, toRipe = self._verifyAddress( # pylint: disable=unused-variable + status, addressVersionNumber, streamNumber, toRipe = self._verifyAddress( suppliedAddress) suppliedAddress = addBMIfNotPresent(suppliedAddress) queues.apiAddressGeneratorReturnQueue.queue.clear() @@ -631,8 +634,8 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): raise APIError(0, 'I need parameters.') elif len(params) == 1: address, = params - # pylint: disable=unused-variable - status, addressVersionNumber, streamNumber, toRipe = self._verifyAddress(address) + status, addressVersionNumber, streamNumber, toRipe = \ + self._verifyAddress(address) address = addBMIfNotPresent(address) if not BMConfigParser().has_section(address): raise APIError( @@ -653,8 +656,8 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): raise APIError(0, 'I need parameters.') elif len(params) == 1: address, = params - # pylint: disable=unused-variable - status, addressVersionNumber, streamNumber, toRipe = self._verifyAddress(address) + status, addressVersionNumber, streamNumber, toRipe = \ + self._verifyAddress(address) address = addBMIfNotPresent(address) if not BMConfigParser().has_section(address): raise APIError( @@ -666,7 +669,7 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): shared.reloadMyAddressHashes() return 'success' - def HandleGetAllInboxMessages(self, params): # pylint: disable=unused-argument + def HandleGetAllInboxMessages(self, params): """Handle a request to get all inbox messages""" queryreturn = sqlQuery( @@ -694,7 +697,7 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): data += ']}' return data - def HandleGetAllInboxMessageIds(self, params): # pylint: disable=unused-argument + def HandleGetAllInboxMessageIds(self, params): """Handle a request to get all inbox message IDs""" queryreturn = sqlQuery( @@ -753,7 +756,7 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): data += ']}' return data - def HandleGetAllSentMessages(self, params): # pylint: disable=unused-argument + def HandleGetAllSentMessages(self, params): """Handle a request to get all sent messages""" queryreturn = sqlQuery( @@ -782,7 +785,7 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): data += ']}' return data - def HandleGetAllSentMessageIds(self, params): # pylint: disable=unused-argument + def HandleGetAllSentMessageIds(self, params): """Handle a request to get all sent message IDs""" queryreturn = sqlQuery( @@ -873,7 +876,7 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): data = '{"sentMessages":[' for row in queryreturn: msgid, toAddress, fromAddress, subject, lastactiontime, message, \ - encodingtype, status, ackdata = row # pylint: disable=unused-variable + encodingtype, status, ackdata = row subject = shared.fixPotentiallyInvalidUTF8Data(subject) message = shared.fixPotentiallyInvalidUTF8Data(message) if len(data) > 25: @@ -983,7 +986,6 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): TTL = 28 * 24 * 60 * 60 toAddress = addBMIfNotPresent(toAddress) fromAddress = addBMIfNotPresent(fromAddress) - # pylint: disable=unused-variable status, addressVersionNumber, streamNumber, toRipe = \ self._verifyAddress(toAddress) self._verifyAddress(fromAddress) @@ -1157,10 +1159,9 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): queues.UISignalQueue.put(('rerenderSubscriptions', '')) return 'Deleted subscription if it existed.' - def ListSubscriptions(self, params): # pylint: disable=unused-argument + def ListSubscriptions(self, params): """Handle a request to list susbcriptions""" - # pylint: disable=unused-variable queryreturn = sqlQuery( "SELECT label, address, enabled FROM subscriptions") data = {'subscriptions': []} @@ -1206,7 +1207,7 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): 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 + print('(For msg message via API) Found proof of work', trialValue, 'Nonce:', nonce) try: print( 'POW took', int(time.time() - powStartTime), 'seconds.', @@ -1224,7 +1225,7 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): int(time.time()) + TTL, '' ) with shared.printLock: - print 'Broadcasting inv for msg(API disseminatePreEncryptedMsg command):', hexlify(inventoryHash) + print('Broadcasting inv for msg(API disseminatePreEncryptedMsg command):', hexlify(inventoryHash)) queues.invQueue.put((toStreamNumber, inventoryHash)) def HandleTrashSentMessageByAckDAta(self, params): @@ -1237,7 +1238,7 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): sqlExecute("UPDATE sent SET folder='trash' WHERE ackdata=?", ackdata) return 'Trashed sent message (assuming message existed).' - def HandleDissimatePubKey(self, params): # pylint: disable=unused-argument + def HandleDissimatePubKey(self, params): """Handle a request to disseminate a public key""" # The device issuing this command to PyBitmessage supplies a pubkey @@ -1254,10 +1255,10 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): target = 2 ** 64 / (( len(payload) + defaults.networkDefaultPayloadLengthExtraBytes + 8 ) * defaults.networkDefaultProofOfWorkNonceTrialsPerByte) - print '(For pubkey message via API) Doing proof of work...' + 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 + print('(For pubkey message via API) Found proof of work', trialValue, 'Nonce:', nonce) payload = pack('>Q', nonce) + payload pubkeyReadPosition = 8 # bypass the nonce @@ -1266,7 +1267,6 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): pubkeyReadPosition += 8 else: pubkeyReadPosition += 4 - # pylint: disable=unused-variable addressVersion, addressVersionLength = decodeVarint( payload[pubkeyReadPosition:pubkeyReadPosition + 10]) pubkeyReadPosition += addressVersionLength @@ -1279,7 +1279,7 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): objectType, pubkeyStreamNumber, payload, int(time.time()) + TTL, '' ) with shared.printLock: - print 'broadcasting inv within API command disseminatePubkey with hash:', hexlify(inventoryHash) + print('broadcasting inv within API command disseminatePubkey with hash:', hexlify(inventoryHash)) queues.invQueue.put((pubkeyStreamNumber, inventoryHash)) def HandleGetMessageDataByDestinationHash(self, params): @@ -1325,7 +1325,7 @@ class MySimpleXMLRPCRequestHandler(SimpleXMLRPCRequestHandler): data += ']}' return data - def HandleClientStatus(self, params): # pylint: disable=unused-argument + def HandleClientStatus(self, params): """Handle a request to get the status of the client""" connections_num = len(network.stats.connectedHostsList()) diff --git a/src/bitmessagecli.py b/src/bitmessagecli.py index 02fed7e9..ff8fb290 100644 --- a/src/bitmessagecli.py +++ b/src/bitmessagecli.py @@ -29,7 +29,8 @@ from bmconfigparser import BMConfigParser api = '' keysName = 'keys.dat' keysPath = 'keys.dat' -usrPrompt = 0 # 0 = First Start, 1 = prompt, 2 = no prompt if the program is starting up +# 0 = First Start, 1 = prompt, 2 = no prompt if the program is starting up +usrPrompt = 0 knownAddresses = dict() @@ -38,7 +39,7 @@ def userInput(message): global usrPrompt - print '\n' + message + print('\n' + message) uInput = raw_input('> ') if uInput.lower() == 'exit': # Returns the user to the main menu @@ -46,7 +47,7 @@ def userInput(message): main() elif uInput.lower() == 'quit': # Quits the program - print '\n Bye\n' + print('\n Bye\n') sys.exit(0) else: @@ -55,9 +56,9 @@ def userInput(message): def restartBmNotify(): """Prompt the user to restart Bitmessage""" - print '\n *******************************************************************' - print ' WARNING: If Bitmessage is running locally, you must restart it now.' - print ' *******************************************************************\n' + print('\n *******************************************************************') + print(' WARNING: If Bitmessage is running locally, you must restart it now.') + print(' *******************************************************************\n') # Begin keys.dat interactions @@ -96,8 +97,8 @@ def configInit(): with open(keysName, 'wb') as configfile: BMConfigParser().write(configfile) - print '\n ' + str(keysName) + ' Initalized in the same directory as daemon.py' - print ' You will now need to configure the ' + str(keysName) + ' file.\n' + print('\n ' + str(keysName) + ' Initalized in the same directory as daemon.py') + print(' You will now need to configure the ' + str(keysName) + ' file.\n') def apiInit(apiEnabled): @@ -114,20 +115,20 @@ def apiInit(apiEnabled): with open(keysPath, 'wb') as configfile: BMConfigParser().write(configfile) - print 'Done' + print('Done') restartBmNotify() return True elif uInput == "n": - print ' \n************************************************************' - print ' Daemon will not work when the API is disabled. ' - print ' Please refer to the Bitmessage Wiki on how to setup the API.' - print ' ************************************************************\n' + print(' \n************************************************************') + print(' Daemon will not work when the API is disabled. ') + print(' Please refer to the Bitmessage Wiki on how to setup the API.') + print(' ************************************************************\n') usrPrompt = 1 main() else: - print '\n Invalid Entry\n' + print('\n Invalid Entry\n') usrPrompt = 1 main() @@ -136,11 +137,11 @@ def apiInit(apiEnabled): return True else: # API information was not present. - print '\n ' + str(keysPath) + ' not properly configured!\n' + print('\n ' + str(keysPath) + ' not properly configured!\n') uInput = userInput("Would you like to do this now, (Y)es or (N)o?").lower() if uInput == "y": # User said yes, initalize the api by writing these values to the keys.dat file - print ' ' + print(' ') apiUsr = userInput("API Username") apiPwd = userInput("API Password") @@ -149,11 +150,11 @@ def apiInit(apiEnabled): daemon = userInput("Daemon mode Enabled? (True) or (False)").lower() if (daemon != 'true' and daemon != 'false'): - print '\n Invalid Entry for Daemon.\n' + print('\n Invalid Entry for Daemon.\n') uInput = 1 main() - print ' -----------------------------------\n' + print(' -----------------------------------\n') # sets the bitmessage port to stop the warning about the api not properly # being setup. This is in the event that the keys.dat is in a different @@ -168,18 +169,18 @@ def apiInit(apiEnabled): with open(keysPath, 'wb') as configfile: BMConfigParser().write(configfile) - print '\n Finished configuring the keys.dat file with API information.\n' + print('\n Finished configuring the keys.dat file with API information.\n') restartBmNotify() return True elif uInput == "n": - print '\n ***********************************************************' - print ' Please refer to the Bitmessage Wiki on how to setup the API.' - print ' ***********************************************************\n' + print('\n ***********************************************************') + print(' Please refer to the Bitmessage Wiki on how to setup the API.') + print(' ***********************************************************\n') usrPrompt = 1 main() else: - print ' \nInvalid entry\n' + print(' \nInvalid entry\n') usrPrompt = 1 main() @@ -206,11 +207,11 @@ def apiData(): BMConfigParser().get('bitmessagesettings', 'port') except: # keys.dat was not there either, something is wrong. - print '\n ******************************************************************' - print ' There was a problem trying to access the Bitmessage keys.dat file' - print ' or keys.dat is not set up correctly' - print ' Make sure that daemon is in the same directory as Bitmessage. ' - print ' ******************************************************************\n' + print('\n ******************************************************************') + print(' There was a problem trying to access the Bitmessage keys.dat file') + print(' or keys.dat is not set up correctly') + print(' Make sure that daemon is in the same directory as Bitmessage. ') + print(' ******************************************************************\n') uInput = userInput("Would you like to create a keys.dat in the local directory, (Y)es or (N)o?").lower() @@ -220,11 +221,11 @@ def apiData(): usrPrompt = 0 main() elif (uInput == "n" or uInput == "no"): - print '\n Trying Again.\n' + print('\n Trying Again.\n') usrPrompt = 0 main() else: - print '\n Invalid Input.\n' + print('\n Invalid Input.\n') usrPrompt = 1 main() @@ -249,7 +250,7 @@ def apiData(): apiUsername = BMConfigParser().get('bitmessagesettings', 'apiusername') apiPassword = BMConfigParser().get('bitmessagesettings', 'apipassword') - print '\n API data successfully imported.\n' + print('\n API data successfully imported.\n') # Build the api credentials return "http://" + apiUsername + ":" + apiPassword + "@" + apiInterface + ":" + str(apiPort) + "/" @@ -281,7 +282,7 @@ def bmSettings(): try: port = BMConfigParser().get('bitmessagesettings', 'port') except: - print '\n File not found.\n' + print('\n File not found.\n') usrPrompt = 0 main() @@ -300,27 +301,27 @@ def bmSettings(): socksusername = BMConfigParser().get('bitmessagesettings', 'socksusername') sockspassword = BMConfigParser().get('bitmessagesettings', 'sockspassword') - print '\n -----------------------------------' - print ' | Current Bitmessage Settings |' - print ' -----------------------------------' - print ' port = ' + port - print ' startonlogon = ' + str(startonlogon) - print ' minimizetotray = ' + str(minimizetotray) - print ' showtraynotifications = ' + str(showtraynotifications) - print ' startintray = ' + str(startintray) - print ' defaultnoncetrialsperbyte = ' + defaultnoncetrialsperbyte - print ' defaultpayloadlengthextrabytes = ' + defaultpayloadlengthextrabytes - print ' daemon = ' + str(daemon) - print '\n ------------------------------------' - print ' | Current Connection Settings |' - print ' -----------------------------------' - print ' socksproxytype = ' + socksproxytype - print ' sockshostname = ' + sockshostname - print ' socksport = ' + socksport - print ' socksauthentication = ' + str(socksauthentication) - print ' socksusername = ' + socksusername - print ' sockspassword = ' + sockspassword - print ' ' + print('\n -----------------------------------') + print(' | Current Bitmessage Settings |') + print(' -----------------------------------') + print(' port = ' + port) + print(' startonlogon = ' + str(startonlogon)) + print(' minimizetotray = ' + str(minimizetotray)) + print(' showtraynotifications = ' + str(showtraynotifications)) + print(' startintray = ' + str(startintray)) + print(' defaultnoncetrialsperbyte = ' + defaultnoncetrialsperbyte) + print(' defaultpayloadlengthextrabytes = ' + defaultpayloadlengthextrabytes) + print(' daemon = ' + str(daemon)) + print('\n ------------------------------------') + print(' | Current Connection Settings |') + print(' -----------------------------------') + print(' socksproxytype = ' + socksproxytype) + print(' sockshostname = ' + sockshostname) + print(' socksport = ' + socksport) + print(' socksauthentication = ' + str(socksauthentication)) + print(' socksusername = ' + socksusername) + print(' sockspassword = ' + sockspassword) + print(' ') uInput = userInput("Would you like to modify any of these settings, (Y)es or (N)o?").lower() @@ -328,74 +329,74 @@ def bmSettings(): while True: # loops if they mistype the setting name, they can exit the loop with 'exit' invalidInput = False uInput = userInput("What setting would you like to modify?").lower() - print ' ' + print(' ') if uInput == "port": - print ' Current port number: ' + port + print(' Current port number: ' + port) uInput = userInput("Enter the new port number.") BMConfigParser().set('bitmessagesettings', 'port', str(uInput)) elif uInput == "startonlogon": - print ' Current status: ' + str(startonlogon) + print(' Current status: ' + str(startonlogon)) uInput = userInput("Enter the new status.") BMConfigParser().set('bitmessagesettings', 'startonlogon', str(uInput)) elif uInput == "minimizetotray": - print ' Current status: ' + str(minimizetotray) + print(' Current status: ' + str(minimizetotray)) uInput = userInput("Enter the new status.") BMConfigParser().set('bitmessagesettings', 'minimizetotray', str(uInput)) elif uInput == "showtraynotifications": - print ' Current status: ' + str(showtraynotifications) + print(' Current status: ' + str(showtraynotifications)) uInput = userInput("Enter the new status.") BMConfigParser().set('bitmessagesettings', 'showtraynotifications', str(uInput)) elif uInput == "startintray": - print ' Current status: ' + str(startintray) + print(' Current status: ' + str(startintray)) uInput = userInput("Enter the new status.") BMConfigParser().set('bitmessagesettings', 'startintray', str(uInput)) elif uInput == "defaultnoncetrialsperbyte": - print ' Current default nonce trials per byte: ' + defaultnoncetrialsperbyte + print(' Current default nonce trials per byte: ' + defaultnoncetrialsperbyte) uInput = userInput("Enter the new defaultnoncetrialsperbyte.") BMConfigParser().set('bitmessagesettings', 'defaultnoncetrialsperbyte', str(uInput)) elif uInput == "defaultpayloadlengthextrabytes": - print ' Current default payload length extra bytes: ' + defaultpayloadlengthextrabytes + print(' Current default payload length extra bytes: ' + defaultpayloadlengthextrabytes) uInput = userInput("Enter the new defaultpayloadlengthextrabytes.") BMConfigParser().set('bitmessagesettings', 'defaultpayloadlengthextrabytes', str(uInput)) elif uInput == "daemon": - print ' Current status: ' + str(daemon) + print(' Current status: ' + str(daemon)) uInput = userInput("Enter the new status.").lower() BMConfigParser().set('bitmessagesettings', 'daemon', str(uInput)) elif uInput == "socksproxytype": - print ' Current socks proxy type: ' + socksproxytype - print "Possibilities: 'none', 'SOCKS4a', 'SOCKS5'." + print(' Current socks proxy type: ' + socksproxytype) + print("Possibilities: 'none', 'SOCKS4a', 'SOCKS5'.") uInput = userInput("Enter the new socksproxytype.") BMConfigParser().set('bitmessagesettings', 'socksproxytype', str(uInput)) elif uInput == "sockshostname": - print ' Current socks host name: ' + sockshostname + print(' Current socks host name: ' + sockshostname) uInput = userInput("Enter the new sockshostname.") BMConfigParser().set('bitmessagesettings', 'sockshostname', str(uInput)) elif uInput == "socksport": - print ' Current socks port number: ' + socksport + print(' Current socks port number: ' + socksport) uInput = userInput("Enter the new socksport.") BMConfigParser().set('bitmessagesettings', 'socksport', str(uInput)) elif uInput == "socksauthentication": - print ' Current status: ' + str(socksauthentication) + print(' Current status: ' + str(socksauthentication)) uInput = userInput("Enter the new status.") BMConfigParser().set('bitmessagesettings', 'socksauthentication', str(uInput)) elif uInput == "socksusername": - print ' Current socks username: ' + socksusername + print(' Current socks username: ' + socksusername) uInput = userInput("Enter the new socksusername.") BMConfigParser().set('bitmessagesettings', 'socksusername', str(uInput)) elif uInput == "sockspassword": - print ' Current socks password: ' + sockspassword + print(' Current socks password: ' + sockspassword) uInput = userInput("Enter the new password.") BMConfigParser().set('bitmessagesettings', 'sockspassword', str(uInput)) else: - print "\n Invalid input. Please try again.\n" + print("\n Invalid input. Please try again.\n") invalidInput = True if invalidInput is not True: # don't prompt if they made a mistake. uInput = userInput("Would you like to change another setting, (Y)es or (N)o?").lower() if uInput != "y": - print '\n Changes Made.\n' + print('\n Changes Made.\n') with open(keysPath, 'wb') as configfile: BMConfigParser().write(configfile) restartBmNotify() @@ -405,7 +406,7 @@ def bmSettings(): usrPrompt = 1 main() else: - print "Invalid input." + print("Invalid input.") usrPrompt = 1 main() @@ -433,10 +434,10 @@ def subscribe(): if address == "c": usrPrompt = 1 - print ' ' + print(' ') main() elif validAddress(address) is False: - print '\n Invalid. "c" to cancel. Please try again.\n' + print('\n Invalid. "c" to cancel. Please try again.\n') else: break @@ -444,7 +445,7 @@ def subscribe(): label = label.encode('base64') api.addSubscription(address, label) - print '\n You are now subscribed to: ' + address + '\n' + print('\n You are now subscribed to: ' + address + '\n') def unsubscribe(): @@ -456,31 +457,31 @@ def unsubscribe(): if address == "c": usrPrompt = 1 - print ' ' + print(' ') main() elif validAddress(address) is False: - print '\n Invalid. "c" to cancel. Please try again.\n' + print('\n Invalid. "c" to cancel. Please try again.\n') else: break userInput("Are you sure, (Y)es or (N)o?").lower() # uInput = api.deleteSubscription(address) - print '\n You are now unsubscribed from: ' + address + '\n' + print('\n You are now unsubscribed from: ' + address + '\n') def listSubscriptions(): """List subscriptions""" global usrPrompt - print '\nLabel, Address, Enabled\n' + print('\nLabel, Address, Enabled\n') try: - print api.listSubscriptions() + print(api.listSubscriptions()) except: - print '\n Connection Error\n' + print('\n Connection Error\n') usrPrompt = 0 main() - print ' ' + print(' ') def createChan(): @@ -490,9 +491,9 @@ def createChan(): password = userInput("Enter channel name") password = password.encode('base64') try: - print api.createChan(password) + print(api.createChan(password)) except: - print '\n Connection Error\n' + print('\n Connection Error\n') usrPrompt = 0 main() @@ -506,19 +507,19 @@ def joinChan(): if address == "c": usrPrompt = 1 - print ' ' + print(' ') main() elif validAddress(address) is False: - print '\n Invalid. "c" to cancel. Please try again.\n' + print('\n Invalid. "c" to cancel. Please try again.\n') else: break password = userInput("Enter channel name") password = password.encode('base64') try: - print api.joinChan(password, address) + print(api.joinChan(password, address)) except: - print '\n Connection Error\n' + print('\n Connection Error\n') usrPrompt = 0 main() @@ -532,17 +533,17 @@ def leaveChan(): if address == "c": usrPrompt = 1 - print ' ' + print(' ') main() elif validAddress(address) is False: - print '\n Invalid. "c" to cancel. Please try again.\n' + print('\n Invalid. "c" to cancel. Please try again.\n') else: break try: - print api.leaveChan(address) + print(api.leaveChan(address)) except: - print '\n Connection Error\n' + print('\n Connection Error\n') usrPrompt = 0 main() @@ -554,14 +555,14 @@ def listAdd(): jsonAddresses = json.loads(api.listAddresses()) numAddresses = len(jsonAddresses['addresses']) # Number of addresses except: - print '\n Connection Error\n' + print('\n Connection Error\n') usrPrompt = 0 main() - # print '\nAddress Number,Label,Address,Stream,Enabled\n' - print '\n --------------------------------------------------------------------------' - print ' | # | Label | Address |S#|Enabled|' - print ' |---|-------------------|-------------------------------------|--|-------|' + # print('\nAddress Number,Label,Address,Stream,Enabled\n') + print('\n --------------------------------------------------------------------------') + print(' | # | Label | Address |S#|Enabled|') + print(' |---|-------------------|-------------------------------------|--|-------|') for addNum in range(0, numAddresses): # processes all of the addresses and lists them out label = (jsonAddresses['addresses'][addNum]['label']).encode( 'utf') # may still misdiplay in some consoles @@ -572,7 +573,7 @@ def listAdd(): if len(label) > 19: label = label[:16] + '...' - print ''.join([ + print(''.join([ ' |', str(addNum).ljust(3), '|', @@ -584,13 +585,13 @@ def listAdd(): '|', enabled.ljust(7), '|', - ]) + ])) - print ''.join([ + print(''.join([ ' ', 74 * '-', '\n', - ]) + ])) def genAdd(lbl, deterministic, passphrase, numOfAdd, addVNum, streamNum, ripe): @@ -603,7 +604,7 @@ def genAdd(lbl, deterministic, passphrase, numOfAdd, addVNum, streamNum, ripe): try: generatedAddress = api.createRandomAddress(addressLabel) except: - print '\n Connection Error\n' + print('\n Connection Error\n') usrPrompt = 0 main() @@ -614,7 +615,7 @@ def genAdd(lbl, deterministic, passphrase, numOfAdd, addVNum, streamNum, ripe): try: generatedAddress = api.createDeterministicAddresses(passphrase, numOfAdd, addVNum, streamNum, ripe) except: - print '\n Connection Error\n' + print('\n Connection Error\n') usrPrompt = 0 main() return generatedAddress @@ -646,7 +647,7 @@ def saveFile(fileName, fileData): with open(filePath, 'wb+') as path_to_file: path_to_file.write(fileData.decode("base64")) - print '\n Successfully saved ' + filePath + '\n' + print('\n Successfully saved ' + filePath + '\n') def attachment(): @@ -667,26 +668,26 @@ def attachment(): with open(filePath): break except IOError: - print '\n %s was not found on your filesystem or can not be opened.\n' % filePath + print('\n %s was not found on your filesystem or can not be opened.\n' % filePath) - # print filesize, and encoding estimate with confirmation if file is over X size (1mb?) + # print(filesize, and encoding estimate with confirmation if file is over X size (1mb?)) invSize = os.path.getsize(filePath) invSize = (invSize / 1024) # Converts to kilobytes round(invSize, 2) # Rounds to two decimal places if invSize > 500.0: # If over 500KB - print ''.join([ + print(''.join([ '\n WARNING:The file that you are trying to attach is ', invSize, 'KB and will take considerable time to send.\n' - ]) + ])) uInput = userInput('Are you sure you still want to attach it, (Y)es or (N)o?').lower() if uInput != "y": - print '\n Attachment discarded.\n' + print('\n Attachment discarded.\n') return '' elif invSize > 184320.0: # If larger than 180MB, discard. - print '\n Attachment too big, maximum allowed size:180MB\n' + print('\n Attachment too big, maximum allowed size:180MB\n') main() pathLen = len(str(ntpath.basename(filePath))) # Gets the length of the filepath excluding the filename @@ -694,17 +695,17 @@ def attachment(): filetype = imghdr.what(filePath) # Tests if it is an image file if filetype is not None: - print '\n ---------------------------------------------------' - print ' Attachment detected as an Image.' - print ' tags will automatically be included,' - print ' allowing the recipient to view the image' - print ' using the "View HTML code..." option in Bitmessage.' - print ' ---------------------------------------------------\n' + print('\n ---------------------------------------------------') + print(' Attachment detected as an Image.') + print(' tags will automatically be included,') + print(' allowing the recipient to view the image') + print(' using the "View HTML code..." option in Bitmessage.') + print(' ---------------------------------------------------\n') isImage = True time.sleep(2) # Alert the user that the encoding process may take some time. - print '\n Encoding Attachment, Please Wait ...\n' + print('\n Encoding Attachment, Please Wait ...\n') with open(filePath, 'rb') as f: # Begin the actual encoding data = f.read(188743680) # Reads files up to 180MB, the maximum size for Bitmessage. @@ -759,10 +760,10 @@ def sendMsg(toAddress, fromAddress, subject, message): if toAddress == "c": usrPrompt = 1 - print ' ' + print(' ') main() elif validAddress(toAddress) is False: - print '\n Invalid Address. "c" to cancel. Please try again.\n' + print('\n Invalid Address. "c" to cancel. Please try again.\n') else: break @@ -771,14 +772,14 @@ def sendMsg(toAddress, fromAddress, subject, message): jsonAddresses = json.loads(api.listAddresses()) numAddresses = len(jsonAddresses['addresses']) # Number of addresses except: - print '\n Connection Error\n' + print('\n Connection Error\n') usrPrompt = 0 main() if numAddresses > 1: # Ask what address to send from if multiple addresses found = False while True: - print ' ' + print(' ') fromAddress = userInput("Enter an Address or Address Label to send from.") if fromAddress == "exit": @@ -795,7 +796,7 @@ def sendMsg(toAddress, fromAddress, subject, message): if found is False: if validAddress(fromAddress) is False: - print '\n Invalid Address. Please try again.\n' + print('\n Invalid Address. Please try again.\n') else: for addNum in range(0, numAddresses): # processes all of the addresses @@ -805,13 +806,13 @@ def sendMsg(toAddress, fromAddress, subject, message): break if found is False: - print '\n The address entered is not one of yours. Please try again.\n' + print('\n The address entered is not one of yours. Please try again.\n') if found: break # Address was found else: # Only one address in address book - print '\n Using the only address in the addressbook to send from.\n' + print('\n Using the only address in the addressbook to send from.\n') fromAddress = jsonAddresses['addresses'][0]['address'] if subject == '': @@ -828,9 +829,9 @@ def sendMsg(toAddress, fromAddress, subject, message): try: ackData = api.sendMessage(toAddress, fromAddress, subject, message) - print '\n Message Status:', api.getStatus(ackData), '\n' + print('\n Message Status:', api.getStatus(ackData), '\n') except: - print '\n Connection Error\n' + print('\n Connection Error\n') usrPrompt = 0 main() @@ -845,7 +846,7 @@ def sendBrd(fromAddress, subject, message): jsonAddresses = json.loads(api.listAddresses()) numAddresses = len(jsonAddresses['addresses']) # Number of addresses except: - print '\n Connection Error\n' + print('\n Connection Error\n') usrPrompt = 0 main() @@ -868,7 +869,7 @@ def sendBrd(fromAddress, subject, message): if found is False: if validAddress(fromAddress) is False: - print '\n Invalid Address. Please try again.\n' + print('\n Invalid Address. Please try again.\n') else: for addNum in range(0, numAddresses): # processes all of the addresses @@ -878,13 +879,13 @@ def sendBrd(fromAddress, subject, message): break if found is False: - print '\n The address entered is not one of yours. Please try again.\n' + print('\n The address entered is not one of yours. Please try again.\n') if found: break # Address was found else: # Only one address in address book - print '\n Using the only address in the addressbook to send from.\n' + print('\n Using the only address in the addressbook to send from.\n') fromAddress = jsonAddresses['addresses'][0]['address'] if subject == '': @@ -901,9 +902,9 @@ def sendBrd(fromAddress, subject, message): try: ackData = api.sendBroadcast(fromAddress, subject, message) - print '\n Message Status:', api.getStatus(ackData), '\n' + print('\n Message Status:', api.getStatus(ackData), '\n') except: - print '\n Connection Error\n' + print('\n Connection Error\n') usrPrompt = 0 main() @@ -916,7 +917,7 @@ def inbox(unreadOnly=False): inboxMessages = json.loads(api.getAllInboxMessages()) numMessages = len(inboxMessages['inboxMessages']) except: - print '\n Connection Error\n' + print('\n Connection Error\n') usrPrompt = 0 main() @@ -926,16 +927,16 @@ def inbox(unreadOnly=False): message = inboxMessages['inboxMessages'][msgNum] # if we are displaying all messages or if this message is unread then display it if not unreadOnly or not message['read']: - print ' -----------------------------------\n' - print ' Message Number:', msgNum # Message Number - print ' To:', getLabelForAddress(message['toAddress']) # Get the to address - print ' From:', getLabelForAddress(message['fromAddress']) # Get the from address - print ' Subject:', message['subject'].decode('base64') # Get the subject - print ''.join([ + print(' -----------------------------------\n') + print(' Message Number:', msgNum) # Message Number + print(' To:', getLabelForAddress(message['toAddress'])) # Get the to address + print(' From:', getLabelForAddress(message['fromAddress'])) # Get the from address + print(' Subject:', message['subject'].decode('base64')) # Get the subject + print(''.join([ ' Received:', datetime.datetime.fromtimestamp( float(message['receivedTime'])).strftime('%Y-%m-%d %H:%M:%S'), - ]) + ])) messagesPrinted += 1 if not message['read']: messagesUnread += 1 @@ -943,9 +944,9 @@ def inbox(unreadOnly=False): if messagesPrinted % 20 == 0 and messagesPrinted != 0: userInput('(Press Enter to continue or type (Exit) to return to the main menu.)').lower() # uInput = - print '\n -----------------------------------' - print ' There are %d unread messages of %d messages in the inbox.' % (messagesUnread, numMessages) - print ' -----------------------------------\n' + print('\n -----------------------------------') + print(' There are %d unread messages of %d messages in the inbox.' % (messagesUnread, numMessages)) + print(' -----------------------------------\n') def outbox(): @@ -956,32 +957,32 @@ def outbox(): outboxMessages = json.loads(api.getAllSentMessages()) numMessages = len(outboxMessages['sentMessages']) except: - print '\n Connection Error\n' + print('\n Connection Error\n') usrPrompt = 0 main() for msgNum in range(0, numMessages): # processes all of the messages in the outbox - print '\n -----------------------------------\n' - print ' Message Number:', msgNum # Message Number - # print ' Message ID:', outboxMessages['sentMessages'][msgNum]['msgid'] - print ' To:', getLabelForAddress(outboxMessages['sentMessages'][msgNum]['toAddress']) # Get the to address + print('\n -----------------------------------\n') + print(' Message Number:', msgNum) # Message Number + # print(' Message ID:', outboxMessages['sentMessages'][msgNum]['msgid']) + # Get the to address + print(' To:', getLabelForAddress(outboxMessages['sentMessages'][msgNum]['toAddress'])) # Get the from address - print ' From:', getLabelForAddress(outboxMessages['sentMessages'][msgNum]['fromAddress']) - print ' Subject:', outboxMessages['sentMessages'][msgNum]['subject'].decode('base64') # Get the subject - print ' Status:', outboxMessages['sentMessages'][msgNum]['status'] # Get the subject - - print ''.join([ + print(' From:', getLabelForAddress(outboxMessages['sentMessages'][msgNum]['fromAddress'])) + print(' Subject:', outboxMessages['sentMessages'][msgNum]['subject'].decode('base64')) # Get the subject + print(' Status:', outboxMessages['sentMessages'][msgNum]['status']) # Get the subject + print(''.join([ ' Last Action Time:', datetime.datetime.fromtimestamp( float(outboxMessages['sentMessages'][msgNum]['lastActionTime'])).strftime('%Y-%m-%d %H:%M:%S'), - ]) + ])) if msgNum % 20 == 0 and msgNum != 0: userInput('(Press Enter to continue or type (Exit) to return to the main menu.)').lower() # uInput = - print '\n -----------------------------------' - print ' There are ', numMessages, ' messages in the outbox.' - print ' -----------------------------------\n' + print('\n -----------------------------------') + print(' There are ', numMessages, ' messages in the outbox.') + print(' -----------------------------------\n') def readSentMsg(msgNum): @@ -992,14 +993,14 @@ def readSentMsg(msgNum): outboxMessages = json.loads(api.getAllSentMessages()) numMessages = len(outboxMessages['sentMessages']) except: - print '\n Connection Error\n' + print('\n Connection Error\n') usrPrompt = 0 main() - print ' ' + print(' ') if msgNum >= numMessages: - print '\n Invalid Message Number.\n' + print('\n Invalid Message Number.\n') main() # Begin attachment detection @@ -1035,19 +1036,19 @@ def readSentMsg(msgNum): # End attachment Detection - print '\n To:', getLabelForAddress(outboxMessages['sentMessages'][msgNum]['toAddress']) # Get the to address + print('\n To:', getLabelForAddress(outboxMessages['sentMessages'][msgNum]['toAddress'])) # Get the to address # Get the from address - print ' From:', getLabelForAddress(outboxMessages['sentMessages'][msgNum]['fromAddress']) - print ' Subject:', outboxMessages['sentMessages'][msgNum]['subject'].decode('base64') # Get the subject - print ' Status:', outboxMessages['sentMessages'][msgNum]['status'] # Get the subject - print ''.join([ + print(' From:', getLabelForAddress(outboxMessages['sentMessages'][msgNum]['fromAddress'])) + print(' Subject:', outboxMessages['sentMessages'][msgNum]['subject'].decode('base64')) # Get the subject + print(' Status:', outboxMessages['sentMessages'][msgNum]['status']) # Get the subject + print(''.join([ ' Last Action Time:', datetime.datetime.fromtimestamp( float(outboxMessages['sentMessages'][msgNum]['lastActionTime'])).strftime('%Y-%m-%d %H:%M:%S'), - ]) - print ' Message:\n' - print message # inboxMessages['inboxMessages'][msgNum]['message'].decode('base64') - print ' ' + ])) + print(' Message:\n') + print(message) # inboxMessages['inboxMessages'][msgNum]['message'].decode('base64') + print(' ') def readMsg(msgNum): @@ -1057,12 +1058,12 @@ def readMsg(msgNum): inboxMessages = json.loads(api.getAllInboxMessages()) numMessages = len(inboxMessages['inboxMessages']) except: - print '\n Connection Error\n' + print('\n Connection Error\n') usrPrompt = 0 main() if msgNum >= numMessages: - print '\n Invalid Message Number.\n' + print('\n Invalid Message Number.\n') main() # Begin attachment detection @@ -1097,17 +1098,17 @@ def readMsg(msgNum): break # End attachment Detection - print '\n To:', getLabelForAddress(inboxMessages['inboxMessages'][msgNum]['toAddress']) # Get the to address + print('\n To:', getLabelForAddress(inboxMessages['inboxMessages'][msgNum]['toAddress'])) # Get the to address # Get the from address - print ' From:', getLabelForAddress(inboxMessages['inboxMessages'][msgNum]['fromAddress']) - print ' Subject:', inboxMessages['inboxMessages'][msgNum]['subject'].decode('base64') # Get the subject - print ''.join([ + print(' From:', getLabelForAddress(inboxMessages['inboxMessages'][msgNum]['fromAddress'])) + print(' Subject:', inboxMessages['inboxMessages'][msgNum]['subject'].decode('base64')) # Get the subject + print(''.join([ ' Received:', datetime.datetime.fromtimestamp( float(inboxMessages['inboxMessages'][msgNum]['receivedTime'])).strftime('%Y-%m-%d %H:%M:%S'), - ]) - print ' Message:\n' - print message # inboxMessages['inboxMessages'][msgNum]['message'].decode('base64') - print ' ' + ])) + print(' Message:\n') + print(message) # inboxMessages['inboxMessages'][msgNum]['message'].decode('base64') + print(' ') return inboxMessages['inboxMessages'][msgNum]['msgid'] @@ -1119,7 +1120,7 @@ def replyMsg(msgNum, forwardORreply): try: inboxMessages = json.loads(api.getAllInboxMessages()) except: - print '\n Connection Error\n' + print('\n Connection Error\n') usrPrompt = 0 main() @@ -1141,14 +1142,14 @@ def replyMsg(msgNum, forwardORreply): if toAdd == "c": usrPrompt = 1 - print ' ' + print(' ') main() elif validAddress(toAdd) is False: - print '\n Invalid Address. "c" to cancel. Please try again.\n' + print('\n Invalid Address. "c" to cancel. Please try again.\n') else: break else: - print '\n Invalid Selection. Reply or Forward only' + print('\n Invalid Selection. Reply or Forward only') usrPrompt = 0 main() @@ -1180,7 +1181,7 @@ def delMsg(msgNum): msgAck = api.trashMessage(msgId) except: - print '\n Connection Error\n' + print('\n Connection Error\n') usrPrompt = 0 main() @@ -1197,7 +1198,7 @@ def delSentMsg(msgNum): msgId = outboxMessages['sentMessages'][int(msgNum)]['msgid'] msgAck = api.trashSentMessage(msgId) except: - print '\n Connection Error\n' + print('\n Connection Error\n') usrPrompt = 0 main() @@ -1233,7 +1234,7 @@ def buildKnownAddresses(): if entry['address'] not in knownAddresses: knownAddresses[entry['address']] = "%s (%s)" % (entry['label'].decode('base64'), entry['address']) except: - print '\n Connection Error\n' + print('\n Connection Error\n') usrPrompt = 0 main() @@ -1248,7 +1249,7 @@ def buildKnownAddresses(): if entry['address'] not in knownAddresses: knownAddresses[entry['address']] = "%s (%s)" % (entry['label'].decode('base64'), entry['address']) except: - print '\n Connection Error\n' + print('\n Connection Error\n') usrPrompt = 0 main() @@ -1263,21 +1264,20 @@ def listAddressBookEntries(): if "API Error" in response: return getAPIErrorCode(response) addressBook = json.loads(response) - print - print ' --------------------------------------------------------------' - print ' | Label | Address |' - print ' |--------------------|---------------------------------------|' + print() + print(' --------------------------------------------------------------') + print(' | Label | Address |') + print(' |--------------------|---------------------------------------|') for entry in addressBook['addresses']: label = entry['label'].decode('base64') address = entry['address'] if len(label) > 19: label = label[:16] + '...' - print ' | ' + label.ljust(19) + '| ' + address.ljust(37) + ' |' - print ' --------------------------------------------------------------' - print - + print(' | ' + label.ljust(19) + '| ' + address.ljust(37) + ' |') + print(' --------------------------------------------------------------') + print() except: - print '\n Connection Error\n' + print('\n Connection Error\n') usrPrompt = 0 main() @@ -1292,7 +1292,7 @@ def addAddressToAddressBook(address, label): if "API Error" in response: return getAPIErrorCode(response) except: - print '\n Connection Error\n' + print('\n Connection Error\n') usrPrompt = 0 main() @@ -1307,7 +1307,7 @@ def deleteAddressFromAddressBook(address): if "API Error" in response: return getAPIErrorCode(response) except: - print '\n Connection Error\n' + print('\n Connection Error\n') usrPrompt = 0 main() @@ -1331,7 +1331,7 @@ def markMessageRead(messageID): if "API Error" in response: return getAPIErrorCode(response) except: - print '\n Connection Error\n' + print('\n Connection Error\n') usrPrompt = 0 main() @@ -1346,7 +1346,7 @@ def markMessageUnread(messageID): if "API Error" in response: return getAPIErrorCode(response) except: - print '\n Connection Error\n' + print('\n Connection Error\n') usrPrompt = 0 main() @@ -1359,7 +1359,7 @@ def markAllMessagesRead(): try: inboxMessages = json.loads(api.getAllInboxMessages())['inboxMessages'] except: - print '\n Connection Error\n' + print('\n Connection Error\n') usrPrompt = 0 main() for message in inboxMessages: @@ -1375,7 +1375,7 @@ def markAllMessagesUnread(): try: inboxMessages = json.loads(api.getAllInboxMessages())['inboxMessages'] except: - print '\n Connection Error\n' + print('\n Connection Error\n') usrPrompt = 0 main() for message in inboxMessages: @@ -1391,15 +1391,15 @@ def clientStatus(): try: client_status = json.loads(api.clientStatus()) except: - print '\n Connection Error\n' + print('\n Connection Error\n') usrPrompt = 0 main() - print "\nnetworkStatus: " + client_status['networkStatus'] + "\n" - print "\nnetworkConnections: " + str(client_status['networkConnections']) + "\n" - print "\nnumberOfPubkeysProcessed: " + str(client_status['numberOfPubkeysProcessed']) + "\n" - print "\nnumberOfMessagesProcessed: " + str(client_status['numberOfMessagesProcessed']) + "\n" - print "\nnumberOfBroadcastsProcessed: " + str(client_status['numberOfBroadcastsProcessed']) + "\n" + print("\nnetworkStatus: " + client_status['networkStatus'] + "\n") + print("\nnetworkConnections: " + str(client_status['networkConnections']) + "\n") + print("\nnumberOfPubkeysProcessed: " + str(client_status['numberOfPubkeysProcessed']) + "\n") + print("\nnumberOfMessagesProcessed: " + str(client_status['numberOfMessagesProcessed']) + "\n") + print("\nnumberOfBroadcastsProcessed: " + str(client_status['numberOfBroadcastsProcessed']) + "\n") def shutdown(): @@ -1409,7 +1409,7 @@ def shutdown(): api.shutdown() except socket.error: pass - print "\nShutdown command relayed\n" + print("\nShutdown command relayed\n") def UI(usrInput): @@ -1418,75 +1418,75 @@ def UI(usrInput): global usrPrompt if usrInput == "help" or usrInput == "h" or usrInput == "?": - print ' ' - print ' -------------------------------------------------------------------------' - print ' | https://github.com/Dokument/PyBitmessage-Daemon |' - print ' |-----------------------------------------------------------------------|' - print ' | Command | Description |' - print ' |------------------------|----------------------------------------------|' - print ' | help | This help file. |' - print ' | apiTest | Tests the API |' - print ' | addInfo | Returns address information (If valid) |' - print ' | bmSettings | BitMessage settings |' - print ' | exit | Use anytime to return to main menu |' - print ' | quit | Quits the program |' - print ' |------------------------|----------------------------------------------|' - print ' | listAddresses | Lists all of the users addresses |' - print ' | generateAddress | Generates a new address |' - print ' | getAddress | Get determinist address from passphrase |' - print ' |------------------------|----------------------------------------------|' - print ' | listAddressBookEntries | Lists entries from the Address Book |' - print ' | addAddressBookEntry | Add address to the Address Book |' - print ' | deleteAddressBookEntry | Deletes address from the Address Book |' - print ' |------------------------|----------------------------------------------|' - print ' | subscribe | Subscribes to an address |' - print ' | unsubscribe | Unsubscribes from an address |' - print ' |------------------------|----------------------------------------------|' - print ' | create | Creates a channel |' - print ' | join | Joins a channel |' - print ' | leave | Leaves a channel |' - print ' |------------------------|----------------------------------------------|' - print ' | inbox | Lists the message information for the inbox |' - print ' | outbox | Lists the message information for the outbox |' - print ' | send | Send a new message or broadcast |' - print ' | unread | Lists all unread inbox messages |' - print ' | read | Reads a message from the inbox or outbox |' - print ' | save | Saves message to text file |' - print ' | delete | Deletes a message or all messages |' - print ' -------------------------------------------------------------------------' - print ' ' + print(' ') + print(' -------------------------------------------------------------------------') + print(' | https://github.com/Dokument/PyBitmessage-Daemon |') + print(' |-----------------------------------------------------------------------|') + print(' | Command | Description |') + print(' |------------------------|----------------------------------------------|') + print(' | help | This help file. |') + print(' | apiTest | Tests the API |') + print(' | addInfo | Returns address information (If valid) |') + print(' | bmSettings | BitMessage settings |') + print(' | exit | Use anytime to return to main menu |') + print(' | quit | Quits the program |') + print(' |------------------------|----------------------------------------------|') + print(' | listAddresses | Lists all of the users addresses |') + print(' | generateAddress | Generates a new address |') + print(' | getAddress | Get determinist address from passphrase |') + print(' |------------------------|----------------------------------------------|') + print(' | listAddressBookEntries | Lists entries from the Address Book |') + print(' | addAddressBookEntry | Add address to the Address Book |') + print(' | deleteAddressBookEntry | Deletes address from the Address Book |') + print(' |------------------------|----------------------------------------------|') + print(' | subscribe | Subscribes to an address |') + print(' | unsubscribe | Unsubscribes from an address |') + print(' |------------------------|----------------------------------------------|') + print(' | create | Creates a channel |') + print(' | join | Joins a channel |') + print(' | leave | Leaves a channel |') + print(' |------------------------|----------------------------------------------|') + print(' | inbox | Lists the message information for the inbox |') + print(' | outbox | Lists the message information for the outbox |') + print(' | send | Send a new message or broadcast |') + print(' | unread | Lists all unread inbox messages |') + print(' | read | Reads a message from the inbox or outbox |') + print(' | save | Saves message to text file |') + print(' | delete | Deletes a message or all messages |') + print(' -------------------------------------------------------------------------') + print(' ') main() elif usrInput == "apitest": # tests the API Connection. if apiTest(): - print '\n API connection test has: PASSED\n' + print('\n API connection test has: PASSED\n') else: - print '\n API connection test has: FAILED\n' + print('\n API connection test has: FAILED\n') main() elif usrInput == "addinfo": tmp_address = userInput('\nEnter the Bitmessage Address.') address_information = json.loads(api.decodeAddress(tmp_address)) - print '\n------------------------------' + print('\n------------------------------') if 'success' in str(address_information['status']).lower(): - print ' Valid Address' - print ' Address Version: %s' % str(address_information['addressVersion']) - print ' Stream Number: %s' % str(address_information['streamNumber']) + print(' Valid Address') + print(' Address Version: %s' % str(address_information['addressVersion'])) + print(' Stream Number: %s' % str(address_information['streamNumber'])) else: - print ' Invalid Address !' + print(' Invalid Address !') - print '------------------------------\n' + print('------------------------------\n') main() elif usrInput == "bmsettings": # tests the API Connection. bmSettings() - print ' ' + print(' ') main() elif usrInput == "quit": # Quits the application - print '\n Bye\n' + print('\n Bye\n') sys.exit(0) elif usrInput == "listaddresses": # Lists all of the identities in the addressbook @@ -1508,17 +1508,17 @@ def UI(usrInput): if isRipe == "y": ripe = True - print genAdd(lbl, deterministic, passphrase, numOfAdd, addVNum, streamNum, ripe) + print(genAdd(lbl, deterministic, passphrase, numOfAdd, addVNum, streamNum, ripe)) main() elif isRipe == "n": ripe = False - print genAdd(lbl, deterministic, passphrase, numOfAdd, addVNum, streamNum, ripe) + print(genAdd(lbl, deterministic, passphrase, numOfAdd, addVNum, streamNum, ripe)) main() elif isRipe == "exit": usrPrompt = 1 main() else: - print '\n Invalid input\n' + print('\n Invalid input\n') main() elif uInput == "r" or uInput == "random": # Creates a random address with user-defined label @@ -1526,18 +1526,18 @@ def UI(usrInput): null = '' lbl = userInput('Enter the label for the new address.') - print genAdd(lbl, deterministic, null, null, null, null, null) + print(genAdd(lbl, deterministic, null, null, null, null, null)) main() else: - print '\n Invalid input\n' + print('\n Invalid input\n') main() elif usrInput == "getaddress": # Gets the address for/from a passphrase phrase = userInput("Enter the address passphrase.") - print '\n Working...\n' + print('\n Working...\n') address = getAddress(phrase, 4, 1) # ,vNumber,sNumber) - print '\n Address: ' + address + '\n' + print('\n Address: ' + address + '\n') usrPrompt = 1 main() @@ -1572,17 +1572,17 @@ def UI(usrInput): main() elif usrInput == "inbox": - print '\n Loading...\n' + print('\n Loading...\n') inbox() main() elif usrInput == "unread": - print '\n Loading...\n' + print('\n Loading...\n') inbox(True) main() elif usrInput == "outbox": - print '\n Loading...\n' + print('\n Loading...\n') outbox() main() @@ -1603,14 +1603,14 @@ def UI(usrInput): uInput = userInput("Would you like to read a message from the (I)nbox or (O)utbox?").lower() if (uInput != 'i' and uInput != 'inbox' and uInput != 'o' and uInput != 'outbox'): - print '\n Invalid Input.\n' + print('\n Invalid Input.\n') usrPrompt = 1 main() msgNum = int(userInput("What is the number of the message you wish to open?")) if (uInput == 'i' or uInput == 'inbox'): - print '\n Loading...\n' + print('\n Loading...\n') messageID = readMsg(msgNum) uInput = userInput("\nWould you like to keep this message unread, (Y)es or (N)o?").lower() @@ -1622,14 +1622,14 @@ def UI(usrInput): uInput = userInput("\nWould you like to (D)elete, (F)orward, (R)eply to, or (Exit) this message?").lower() if uInput in ['r', 'reply']: - print '\n Loading...\n' - print ' ' + print('\n Loading...\n') + print(' ') replyMsg(msgNum, 'reply') usrPrompt = 1 elif uInput == 'f' or uInput == 'forward': - print '\n Loading...\n' - print ' ' + print('\n Loading...\n') + print(' ') replyMsg(msgNum, 'forward') usrPrompt = 1 @@ -1638,12 +1638,12 @@ def UI(usrInput): if uInput == "y": delMsg(msgNum) - print '\n Message Deleted.\n' + print('\n Message Deleted.\n') usrPrompt = 1 else: usrPrompt = 1 else: - print '\n Invalid entry\n' + print('\n Invalid entry\n') usrPrompt = 1 elif (uInput == 'o' or uInput == 'outbox'): @@ -1657,12 +1657,12 @@ def UI(usrInput): if uInput == "y": delSentMsg(msgNum) - print '\n Message Deleted.\n' + print('\n Message Deleted.\n') usrPrompt = 1 else: usrPrompt = 1 else: - print '\n Invalid Entry\n' + print('\n Invalid Entry\n') usrPrompt = 1 main() @@ -1672,7 +1672,7 @@ def UI(usrInput): uInput = userInput("Would you like to save a message from the (I)nbox or (O)utbox?").lower() if uInput not in ['i', 'inbox', 'o', 'outbox']: - print '\n Invalid Input.\n' + print('\n Invalid Input.\n') usrPrompt = 1 main() @@ -1684,7 +1684,7 @@ def UI(usrInput): msgNum = int(userInput("What is the number of the message you wish to save?")) if msgNum >= numMessages: - print '\n Invalid Message Number.\n' + print('\n Invalid Message Number.\n') else: break @@ -1700,7 +1700,7 @@ def UI(usrInput): msgNum = int(userInput("What is the number of the message you wish to save?")) if msgNum >= numMessages: - print '\n Invalid Message Number.\n' + print('\n Invalid Message Number.\n') else: break @@ -1729,7 +1729,7 @@ def UI(usrInput): if msgNum == 'a' or msgNum == 'all': break elif int(msgNum) >= numMessages: - print '\n Invalid Message Number.\n' + print('\n Invalid Message Number.\n') else: break @@ -1737,17 +1737,17 @@ def UI(usrInput): if uInput == "y": if msgNum in ['a', 'all']: - print ' ' + print(' ') for msgNum in range(0, numMessages): # processes all of the messages in the inbox - print ' Deleting message ', msgNum + 1, ' of ', numMessages + print(' Deleting message ', msgNum + 1, ' of ', numMessages) delMsg(0) - print '\n Inbox is empty.' + print('\n Inbox is empty.') usrPrompt = 1 else: delMsg(int(msgNum)) - print '\n Notice: Message numbers may have changed.\n' + print('\n Notice: Message numbers may have changed.\n') main() else: usrPrompt = 1 @@ -1763,7 +1763,7 @@ def UI(usrInput): if msgNum in ['a', 'all']: break elif int(msgNum) >= numMessages: - print '\n Invalid Message Number.\n' + print('\n Invalid Message Number.\n') else: break @@ -1771,33 +1771,33 @@ def UI(usrInput): if uInput == "y": if msgNum in ['a', 'all']: - print ' ' + print(' ') for msgNum in range(0, numMessages): # processes all of the messages in the outbox - print ' Deleting message ', msgNum + 1, ' of ', numMessages + print(' Deleting message ', msgNum + 1, ' of ', numMessages) delSentMsg(0) - print '\n Outbox is empty.' + print('\n Outbox is empty.') usrPrompt = 1 else: delSentMsg(int(msgNum)) - print '\n Notice: Message numbers may have changed.\n' + print('\n Notice: Message numbers may have changed.\n') main() else: usrPrompt = 1 else: - print '\n Invalid Entry.\n' + print('\n Invalid Entry.\n') usrPrompt = 1 main() elif usrInput == "exit": - print '\n You are already at the main menu. Use "quit" to quit.\n' + print('\n You are already at the main menu. Use "quit" to quit.\n') usrPrompt = 1 main() elif usrInput == "listaddressbookentries": res = listAddressBookEntries() if res == 20: - print '\n Error: API function not supported.\n' + print('\n Error: API function not supported.\n') usrPrompt = 1 main() @@ -1806,9 +1806,9 @@ def UI(usrInput): label = userInput('Enter label') res = addAddressToAddressBook(address, label) if res == 16: - print '\n Error: Address already exists in Address Book.\n' + print('\n Error: Address already exists in Address Book.\n') if res == 20: - print '\n Error: API function not supported.\n' + print('\n Error: API function not supported.\n') usrPrompt = 1 main() @@ -1816,7 +1816,7 @@ def UI(usrInput): address = userInput('Enter address') res = deleteAddressFromAddressBook(address) if res == 20: - print '\n Error: API function not supported.\n' + print('\n Error: API function not supported.\n') usrPrompt = 1 main() @@ -1841,7 +1841,7 @@ def UI(usrInput): main() else: - print '\n "', usrInput, '" is not a command.\n' + print('\n "', usrInput, '" is not a command.\n') usrPrompt = 1 main() @@ -1853,24 +1853,24 @@ def main(): global usrPrompt if usrPrompt == 0: - print '\n ------------------------------' - print ' | Bitmessage Daemon by .dok |' - print ' | Version 0.3.1 for BM 0.6.2 |' - print ' ------------------------------' + print('\n ------------------------------') + print(' | Bitmessage Daemon by .dok |') + print(' | Version 0.3.1 for BM 0.6.2 |') + print(' ------------------------------') api = xmlrpclib.ServerProxy(apiData()) # Connect to BitMessage using these api credentials if apiTest() is False: - print '\n ****************************************************************' - print ' WARNING: You are not connected to the Bitmessage client.' - print ' Either Bitmessage is not running or your settings are incorrect.' - print ' Use the command "apiTest" or "bmSettings" to resolve this issue.' - print ' ****************************************************************\n' + print('\n ****************************************************************') + print(' WARNING: You are not connected to the Bitmessage client.') + print(' Either Bitmessage is not running or your settings are incorrect.') + print(' Use the command "apiTest" or "bmSettings" to resolve this issue.') + print(' ****************************************************************\n') - print 'Type (H)elp for a list of commands.' # Startup message + print('Type (H)elp for a list of commands.') # Startup message usrPrompt = 2 elif usrPrompt == 1: - print '\nType (H)elp for a list of commands.' # Startup message + print('\nType (H)elp for a list of commands.') # Startup message usrPrompt = 2 try: diff --git a/src/bitmessagecurses/__init__.py b/src/bitmessagecurses/__init__.py index 80dc3f14..4b893852 100644 --- a/src/bitmessagecurses/__init__.py +++ b/src/bitmessagecurses/__init__.py @@ -1010,7 +1010,7 @@ def sendMessage(sender="", recv="", broadcast=None, subject="", body="", reply=F def loadInbox(): """Load the list of messages""" sys.stdout = sys.__stdout__ - print "Loading inbox messages..." + print("Loading inbox messages...") sys.stdout = printlog where = "toaddress || fromaddress || subject || message" @@ -1062,7 +1062,7 @@ def loadInbox(): def loadSent(): """Load the messages that sent""" sys.stdout = sys.__stdout__ - print "Loading sent messages..." + print("Loading sent messages...") sys.stdout = printlog where = "toaddress || fromaddress || subject || message" @@ -1148,7 +1148,7 @@ def loadSent(): def loadAddrBook(): """Load address book""" sys.stdout = sys.__stdout__ - print "Loading address book..." + print("Loading address book...") sys.stdout = printlog ret = sqlQuery("SELECT label, address FROM addressbook") @@ -1254,7 +1254,7 @@ def run(stdscr): def doShutdown(): """Shutting the app down""" sys.stdout = sys.__stdout__ - print "Shutting down..." + print("Shutting down...") sys.stdout = printlog shutdown.doCleanShutdown() sys.stdout = sys.__stdout__ diff --git a/src/bitmessagekivy/identiconGeneration.py b/src/bitmessagekivy/identiconGeneration.py index 42b5816a..25bd2254 100644 --- a/src/bitmessagekivy/identiconGeneration.py +++ b/src/bitmessagekivy/identiconGeneration.py @@ -2,7 +2,6 @@ Core classes for loading images and converting them to a Texture. The raw image data can be keep in memory for further access """ - import hashlib from io import BytesIO @@ -26,7 +25,6 @@ def generate(Generate_string=None): image = Image.new(MODE, V_RESOLUTION, BACKGROUND_COLOR) image = generate_image(image, color, hash_string) image = image.resize(RESOLUTION, 0) - data = BytesIO() image.save(data, format='png') data.seek(0) @@ -46,10 +44,8 @@ def generate_hash(string): string = str.lower(string) hash_object = hashlib.md5(str.encode(string)) print(hash_object.hexdigest()) - # returned object is a hex string return hash_object.hexdigest() - except IndexError: print("Error: Please enter a string as an argument.") @@ -59,29 +55,24 @@ def random_color(hash_string): # remove first three digits from hex string split = 6 rgb = hash_string[:split] - split = 2 r = rgb[:split] g = rgb[split:2 * split] b = rgb[2 * split:3 * split] - color = (int(r, 16), int(g, 16), int(b, 16), 0xFF) - return color def generate_image(image, color, hash_string): """Generating images""" hash_string = hash_string[6:] - lower_x = 1 lower_y = 1 upper_x = int(V_RESOLUTION[0] / 2) + 1 upper_y = V_RESOLUTION[1] - 1 limit_x = V_RESOLUTION[0] - 1 index = 0 - for x in range(lower_x, upper_x): for y in range(lower_y, upper_y): if int(hash_string[index], 16) % 2 == 0: @@ -89,5 +80,4 @@ def generate_image(image, color, hash_string): image.putpixel((limit_x - x, y), color) index = index + 1 - return image diff --git a/src/bitmessagekivy/kivy_helper_search.py b/src/bitmessagekivy/kivy_helper_search.py index 48e77cb2..c05e69d4 100644 --- a/src/bitmessagekivy/kivy_helper_search.py +++ b/src/bitmessagekivy/kivy_helper_search.py @@ -4,25 +4,25 @@ Sql queries for bitmessagekivy from helper_sql import sqlQuery -def search_sql(xAddress="toaddress", account=None, folder="inbox", where=None, what=None, unreadOnly=False, start_indx=0, end_indx=20): +def search_sql( + xAddress="toaddress", account=None, folder="inbox", where=None, + what=None, unreadOnly=False, start_indx=0, end_indx=20): """Method helping for searching mails""" # pylint: disable=too-many-arguments, too-many-branches if what is not None and what != "": what = "%" + what + "%" else: what = None - if folder == "sent" or folder == "draft": sqlStatementBase = ( - '''SELECT toaddress, fromaddress, subject, message, status, ackdata,''' - ''' lastactiontime FROM sent ''') + '''SELECT toaddress, fromaddress, subject, message, status,''' + ''' ackdata, lastactiontime FROM sent ''') elif folder == "addressbook": sqlStatementBase = '''SELECT label, address From addressbook ''' else: sqlStatementBase = ( - '''SELECT folder, msgid, toaddress, message, fromaddress, subject,''' - ''' received, read FROM inbox ''') - + '''SELECT folder, msgid, toaddress, message, fromaddress,''' + ''' subject, received, read FROM inbox ''') sqlStatementParts = [] sqlArguments = [] if account is not None: @@ -58,10 +58,15 @@ def search_sql(xAddress="toaddress", account=None, folder="inbox", where=None, w sqlStatementParts.append("read = 0") if sqlStatementParts: sqlStatementBase += "WHERE " + " AND ".join(sqlStatementParts) + # if folder in ("sent", "draft"): if folder == "sent" or folder == "draft": - sqlStatementBase += " ORDER BY lastactiontime DESC limit {0}, {1}".format(start_indx, end_indx) + sqlStatementBase += \ + "ORDER BY lastactiontime DESC limit {0}, {1}".format( + start_indx, end_indx) elif folder == "inbox": - sqlStatementBase += " ORDER BY received DESC limit {0}, {1}".format(start_indx, end_indx) + sqlStatementBase += \ + "ORDER BY received DESC limit {0}, {1}".format( + start_indx, end_indx) # elif folder == "addressbook": # sqlStatementBase += " limit {0}, {1}".format(start_indx, end_indx) - return sqlQuery(sqlStatementBase, sqlArguments) + return sqlQuery(sqlStatementBase, sqlArguments) \ No newline at end of file diff --git a/src/bitmessagekivy/main.kv b/src/bitmessagekivy/main.kv index b360a534..67f24e01 100644 --- a/src/bitmessagekivy/main.kv +++ b/src/bitmessagekivy/main.kv @@ -25,7 +25,8 @@ #:set color_font (0.957, 0.890, 0.843, 1) # off white : - icon: 'checkbox-blank-circle' + font_style: 'Body1' + theme_text_color: 'Secondary' : font_size: '12.5sp' @@ -39,7 +40,7 @@ height: dp(7) NavigationDrawerSubheader: text: "Accounts" - NavigationDrawerIconButton: + AddressDropdown: CustomSpinner: id: btn pos_hint:{"x":0,"y":.25} @@ -57,47 +58,48 @@ y: self.parent.y + self.parent.height/4 size: self.parent.height/2, self.parent.height/2 ArrowImg: - NavigationDrawerIconButton: + MyNavigationDrawerIconButton: id: inbox_cnt icon: 'email-open' text: "Inbox" on_release: app.root.ids.scr_mngr.current = 'inbox' badge_text: "0" on_press: app.load_screen(self) - NavigationDrawerIconButton: + MyNavigationDrawerIconButton: id: send_cnt icon: 'send' text: "Sent" + #use_active: False on_release: app.root.ids.scr_mngr.current = 'sent' badge_text: "0" - NavigationDrawerIconButton: + MyNavigationDrawerIconButton: id: draft_cnt icon: 'message-draw' text: "Draft" on_release: app.root.ids.scr_mngr.current = 'draft' badge_text: "0" - #NavigationDrawerIconButton: + #MyNavigationDrawerIconButton: #text: "Starred" #icon:'star' #on_release: app.root.ids.scr_mngr.current = 'starred' #badge_text: "0" - #NavigationDrawerIconButton: + #MyNavigationDrawerIconButton: #icon: 'archive' #text: "Archieve" #on_release: app.root.ids.scr_mngr.current = 'archieve' #badge_text: "0" - #NavigationDrawerIconButton: + #MyNavigationDrawerIconButton: #icon: 'email-open-outline' #text: "Spam" #on_release: app.root.ids.scr_mngr.current = 'spam' #badge_text: "0" - NavigationDrawerIconButton: + MyNavigationDrawerIconButton: id: trash_cnt icon: 'delete' text: "Trash" on_release: app.root.ids.scr_mngr.current = 'trash' badge_text: "0" - NavigationDrawerIconButton: + MyNavigationDrawerIconButton: id: allmail_cnt text: "All Mails" icon:'contact-mail' @@ -107,31 +109,31 @@ NavigationDrawerDivider: NavigationDrawerSubheader: text: "All labels" - NavigationDrawerIconButton: + MyNavigationDrawerIconButton: text: "Address Book" icon:'book-multiple' on_release: app.root.ids.scr_mngr.current = 'addressbook' - NavigationDrawerIconButton: + MyNavigationDrawerIconButton: text: "Settings" icon:'settings' on_release: app.root.ids.scr_mngr.current = 'set' - NavigationDrawerIconButton: + MyNavigationDrawerIconButton: text: "Subscriptions/Payment" icon:'bell' on_release: app.root.ids.scr_mngr.current = 'payment' - NavigationDrawerIconButton: + MyNavigationDrawerIconButton: text: "Credits" icon:'wallet' on_release: app.root.ids.scr_mngr.current = 'credits' - NavigationDrawerIconButton: + MyNavigationDrawerIconButton: text: "new address" icon:'account-plus' on_release: app.root.ids.scr_mngr.current = 'login' - NavigationDrawerIconButton: + MyNavigationDrawerIconButton: text: "Network Status" icon:'server-network' on_release: app.root.ids.scr_mngr.current = 'networkstat' - NavigationDrawerIconButton: + MyNavigationDrawerIconButton: text: "My Addresses" icon:'account-multiple' on_release: app.root.ids.scr_mngr.current = 'myaddress' @@ -206,8 +208,17 @@ NavigationLayout: transition: NoTransition() BoxLayout: orientation: 'vertical' - spacing: dp(10) + spacing: dp(5) SearchBar: + GridLayout: + id: identi_tag + padding: [20, 0, 0, 5] + cols: 1 + size_hint_y: None + height: self.minimum_height + MDLabel: + text: '' + font_style: 'Subtitle2' #FloatLayout: # MDScrollViewRefreshLayout: # id: refresh_layout @@ -229,7 +240,17 @@ NavigationLayout: name: 'sent' BoxLayout: orientation: 'vertical' + spacing: dp(5) SearchBar: + GridLayout: + id: identi_tag + padding: [20, 0, 0, 5] + cols: 1 + size_hint_y: None + height: self.minimum_height + MDLabel: + text: '' + font_style: 'Subtitle2' BoxLayout: orientation:'vertical' ScrollView: @@ -242,21 +263,50 @@ NavigationLayout: : name: 'trash' - ScrollView: - id: scroll_y - do_scroll_x: False - MDList: - id: ml + BoxLayout: + orientation: 'vertical' + spacing: dp(5) + GridLayout: + id: identi_tag + padding: [20, 20, 0, 5] + spacing: dp(5) + cols: 1 + size_hint_y: None + height: self.minimum_height + MDLabel: + text: '' + font_style: 'Subtitle2' + BoxLayout: + orientation:'vertical' + ScrollView: + id: scroll_y + do_scroll_x: False + MDList: + id: ml Loader: ComposerButton: : name: 'draft' - ScrollView: - id: scroll_y - do_scroll_x: False - MDList: - id: ml + BoxLayout: + orientation: 'vertical' + spacing: dp(5) + GridLayout: + id: identi_tag + padding: [20, 20, 0, 5] + cols: 1 + size_hint_y: None + height: self.minimum_height + MDLabel: + text: '' + font_style: 'Subtitle2' + BoxLayout: + orientation:'vertical' + ScrollView: + id: scroll_y + do_scroll_x: False + MDList: + id: ml ComposerButton: : @@ -293,12 +343,25 @@ NavigationLayout: # MDList: # id: ml BoxLayout: - orientation:'vertical' - ScrollView: - id: scroll_y - do_scroll_x: False - MDList: - id: ml + orientation: 'vertical' + spacing: dp(5) + GridLayout: + id: identi_tag + padding: [20, 20, 0, 5] + spacing: dp(5) + cols: 1 + size_hint_y: None + height: self.minimum_height + MDLabel: + text: '' + font_style: 'Subtitle2' + BoxLayout: + orientation:'vertical' + ScrollView: + id: scroll_y + do_scroll_x: False + MDList: + id: ml Loader: ComposerButton: @@ -545,12 +608,6 @@ NavigationLayout: color: (1,1,1,1) halign: 'center' -: - name: 'add_sucess' - Label: - text: 'Successfully created a new bit address' - color: 0,0,0,1 - : name: 'set' ScrollView: @@ -624,7 +681,17 @@ NavigationLayout: name: 'myaddress' BoxLayout: orientation: 'vertical' + spacing: dp(5) SearchBar: + GridLayout: + id: identi_tag + padding: [20, 0, 0, 5] + cols: 1 + size_hint_y: None + height: self.minimum_height + MDLabel: + text: 'My Addresses' + font_style: 'Subtitle2' FloatLayout: MDScrollViewRefreshLayout: id: refresh_layout @@ -639,7 +706,17 @@ NavigationLayout: name: 'addressbook' BoxLayout: orientation: 'vertical' + spacing: dp(5) SearchBar: + GridLayout: + id: identi_tag + padding: [20, 0, 0, 5] + cols: 1 + size_hint_y: None + height: self.minimum_height + MDLabel: + text: '' + font_style: 'Subtitle2' BoxLayout: orientation:'vertical' ScrollView: @@ -800,7 +877,7 @@ NavigationLayout: id: popup size_hint : (None,None) height: 2*(label.height + address.height) + 10 - width :app.window_size[0] - app.window_size[0]/10 + width :app.window_size[0] - (app.window_size[0]/10 if app.app_platform == 'android' else app.window_size[0]/4) title: 'add contact\'s' background: './images/popup.jpeg' title_size: sp(20) @@ -1031,7 +1108,7 @@ NavigationLayout: id: myadd_popup size_hint : (None,None) height: 4.5*(myaddr_label.height+ my_add_btn.children[0].height) - width :app.window_size[0] - app.window_size[0]/10 + width :app.window_size[0] - (app.window_size[0]/10 if app.app_platform == 'android' else app.window_size[0]/4) background: './images/popup.jpeg' auto_dismiss: False separator_height: 0 @@ -1111,7 +1188,7 @@ NavigationLayout: id: addbook_popup size_hint : (None,None) height: 4*(add_label.height) - width :app.window_size[0] - app.window_size[0]/10 + width :app.window_size[0] - (app.window_size[0]/10 if app.app_platform == 'android' else app.window_size[0]/4) background: './images/popup.jpeg' separator_height: 0 auto_dismiss: False diff --git a/src/bitmessagekivy/mpybit.py b/src/bitmessagekivy/mpybit.py index 64bbfc67..bcb7c511 100644 --- a/src/bitmessagekivy/mpybit.py +++ b/src/bitmessagekivy/mpybit.py @@ -1,8 +1,9 @@ """ -Bitmessage android(mobile) interface +src/bitmessagekivy/mpybit.py +================================= """ -# pylint: disable=relative-import, import-error, no-name-in-module -# pylint: disable=too-few-public-methods, too-many-lines, unused-argument +# pylint: disable=import-error, no-name-in-module, too-many-lines +# pylint: disable=too-few-public-methods, unused-argument, too-many-ancestors import os import time from bmconfigparser import BMConfigParser @@ -36,9 +37,7 @@ from kivy.uix.screenmanager import Screen from kivy.uix.spinner import Spinner from kivy.uix.textinput import TextInput from kivy.utils import platform - - -from bitmessagekivy import kivy_helper_search +from bitmessagekivy import kivy_helper_search from kivymd.uix.button import MDIconButton from kivymd.uix.dialog import MDDialog from kivymd.uix.label import MDLabel @@ -48,7 +47,7 @@ from kivymd.uix.list import ( IRightBodyTouch, TwoLineAvatarIconListItem, TwoLineListItem, - OneLineIconListItem + OneLineIconListItem, ) from kivymd.uix.navigationdrawer import ( MDNavigationDrawer, @@ -60,35 +59,36 @@ import queues from semaphores import kivyuisignaler import state -from bitmessagekivy.uikivysignaler import UIkivySignaler +from bitmessagekivy.uikivysignaler import UIkivySignaler from bitmessagekivy import identiconGeneration -from addresses import addBMIfNotPresent, decodeAddress +from addresses import addBMIfNotPresent, decodeAddress, encodeVarint +# pylint: disable=unused-argument, too-few-public-methods def toast(text): - """Function displays toast message""" - # pylint: disable=redefined-outer-name - from kivymd.toast.kivytoast import toast + """Method will display the toast message""" + from kivymd.toast.kivytoast import toast # pylint: disable=redefined-outer-name toast(text) return class Navigatorss(MDNavigationDrawer): - """Navigator class (image, title and logo)""" + """Navigators class contains image, title and logo""" + image_source = StringProperty('images/qidenticon_two.png') title = StringProperty('Navigation') drawer_logo = StringProperty() class Inbox(Screen): - """Inbox Screen uses screen to show widgets of screens.""" + """Inbox Screen uses screen to show widgets of screens""" queryreturn = ListProperty() has_refreshed = True account = StringProperty() def __init__(self, *args, **kwargs): - """Method Parsing the address.""" + """Method Parsing the address""" super(Inbox, self).__init__(*args, **kwargs) Clock.schedule_once(self.init_ui, 0) @@ -100,11 +100,11 @@ class Inbox(Screen): state.association = BMConfigParser().addresses()[0] def init_ui(self, dt=0): - """Clock schdule for method inbox accounts.""" + """Clock schdule for method inbox accounts""" self.loadMessagelist() def loadMessagelist(self, where="", what=""): - """Load Inbox list for Inbox messages.""" + """Load Inbox list for Inbox messages""" # pylint: disable=too-many-locals self.set_defaultAddress() self.account = state.association @@ -260,6 +260,8 @@ class Inbox(Screen): int(state.trash_count) + 1) state.all_count = str( int(state.all_count) - 1) + if int(state.inbox_count) <= 0: + self.ids.identi_tag.children[0].text = '' self.ids.ml.remove_widget( instance.parent.parent) toast('Deleted') @@ -303,13 +305,13 @@ class Inbox(Screen): class MyAddress(Screen): - """MyAddress screen uses screen to show widgets of screens.""" + """MyAddress screen uses screen to show widgets of screens""" addresses_list = ListProperty() has_refreshed = True is_add_created = False def __init__(self, *args, **kwargs): - """Clock schdule for method Myaddress accounts.""" + """Clock schdule for method Myaddress accounts""" super(MyAddress, self).__init__(*args, **kwargs) Clock.schedule_once(self.init_ui, 0) @@ -319,12 +321,12 @@ class MyAddress(Screen): self.addresses_list = state.kivyapp.variable_1 if state.searcing_text: self.ids.refresh_layout.scroll_y = 1.0 - filtered_list = filter( - lambda addr: self.filter_address( - addr), BMConfigParser().addresses()) + filtered_list = [x for x in BMConfigParser().addresses() if self.filter_address(x)] self.addresses_list = filtered_list self.addresses_list = [obj for obj in reversed(self.addresses_list)] + self.ids.identi_tag.children[0].text = '' if self.addresses_list: + self.ids.identi_tag.children[0].text = 'My Addresses' self.has_refreshed = True self.set_mdList(0, 15) self.ids.refresh_layout.bind(scroll_y=self.check_scroll_y) @@ -395,7 +397,7 @@ class MyAddress(Screen): """Method used for loading the myaddress screen data""" state.searcing_text = '' state.kivyapp.root.ids.sc10.children[2].active = False - self.children[2].children[1].ids.search_field.text = '' + self.children[2].children[2].ids.search_field.text = '' self.has_refreshed = True self.ids.ml.clear_widgets() self.init_ui() @@ -406,9 +408,7 @@ class MyAddress(Screen): @staticmethod def filter_address(address): """Method will filter the my address list data""" - if filter(lambda x: (state.searcing_text).lower() in x, [ - BMConfigParser().get( - address, 'label').lower(), address.lower()]): + if [x for x in [BMConfigParser().get(address, 'label').lower(), address.lower()] if (state.searcing_text).lower() in x]: return True return False @@ -439,10 +439,12 @@ class AddressBook(Screen): where = ['label', 'address'] what = state.searcing_text xAddress = '' + self.ids.identi_tag.children[0].text = '' self.queryreturn = kivy_helper_search.search_sql( xAddress, account, "addressbook", where, what, False) self.queryreturn = [obj for obj in reversed(self.queryreturn)] if self.queryreturn: + self.ids.identi_tag.children[0].text = 'Address Book' self.has_refreshed = True self.set_mdList(0, 20) self.ids.scroll_y.bind(scroll_y=self.check_scroll_y) @@ -518,19 +520,22 @@ class AddressBook(Screen): def delete_address(self, address, instance, *args): """Delete inbox mail from inbox listing""" self.ids.ml.remove_widget(instance.parent.parent) + if len(self.ids.ml.children) == 0: + self.ids.identi_tag.children[0].text = '' sqlExecute( "DELETE FROM addressbook WHERE address = '{}';".format(address)) -class SelectableRecycleBoxLayout( - FocusBehavior, LayoutSelectionBehavior, RecycleBoxLayout): +class SelectableRecycleBoxLayout(FocusBehavior, LayoutSelectionBehavior, + RecycleBoxLayout): """Adds selection and focus behaviour to the view""" - # pylint: disable = too-many-ancestors, duplicate-bases + # pylint: disable = duplicate-bases pass class SelectableLabel(RecycleDataViewBehavior, Label): """Add selection support to the Label""" + index = None selected = BooleanProperty(False) selectable = BooleanProperty(True) @@ -541,7 +546,6 @@ class SelectableLabel(RecycleDataViewBehavior, Label): return super(SelectableLabel, self).refresh_view_attrs( rv, index, data) - # pylint: disable=inconsistent-return-statements def on_touch_down(self, touch): """Add selection on touch down""" if super(SelectableLabel, self).on_touch_down(touch): @@ -560,7 +564,8 @@ class SelectableLabel(RecycleDataViewBehavior, Label): class RV(RecycleView): """Recycling View""" - def __init__(self, **kwargs): # pylint: disable=useless-super-delegation + + def __init__(self, **kwargs): # pylint: disable=useless-super-delegation """Recycling Method""" super(RV, self).__init__(**kwargs) @@ -568,7 +573,6 @@ class RV(RecycleView): class DropDownWidget(BoxLayout): """Adding Dropdown Widget""" # pylint: disable=too-many-statements, too-many-locals - # pylint: disable=inconsistent-return-statements txt_input = ObjectProperty() rv = ObjectProperty() @@ -579,10 +583,11 @@ class DropDownWidget(BoxLayout): subject = self.ids.subject.text.strip() message = self.ids.subject.text.strip() encoding = 3 - print ("message: ", self.ids.body.text) + print("message: ", self.ids.body.text) sendMessageToPeople = True if sendMessageToPeople: if toAddress != '' and subject and message: + from addresses import decodeAddress status, addressVersionNumber, streamNumber, ripe = ( decodeAddress(toAddress)) if status == 'success': @@ -601,17 +606,19 @@ class DropDownWidget(BoxLayout): state.send_draft_mail) self.parent.parent.screens[15].clear_widgets() self.parent.parent.screens[15].add_widget(Draft()) + # state.detailPageType = '' + # state.send_draft_mail = None else: + from addresses import addBMIfNotPresent toAddress = addBMIfNotPresent(toAddress) statusIconColor = 'red' if (addressVersionNumber > 4) or ( addressVersionNumber <= 1): - print ("addressVersionNumber > 4"\ - " or addressVersionNumber <= 1") + print("addressVersionNumber > 4 or addressVersionNumber <= 1") if streamNumber > 1 or streamNumber == 0: - print ("streamNumber > 1 or streamNumber == 0") + print("streamNumber > 1 or streamNumber == 0") if statusIconColor == 'red': - print ("shared.statusIconColor == 'red'") + print("shared.statusIconColor == 'red'") stealthLevel = BMConfigParser().safeGetInt( 'bitmessagesettings', 'ackstealthlevel') from helper_ackPayload import genAckPayload @@ -652,7 +659,7 @@ class DropDownWidget(BoxLayout): # self.parent.parent.screens[16].add_widget(Allmails()) Clock.schedule_once(self.callback_for_msgsend, 3) queues.workerQueue.put(('sendmessage', toAddress)) - print ("sqlExecute successfully #######################") + print("sqlExecute successfully #######################") state.in_composer = True return else: @@ -674,9 +681,10 @@ class DropDownWidget(BoxLayout): # pylint: disable=attribute-defined-outside-init def address_error_message(self, msg): """Generates error message""" + width = .8 if platform == 'android' else .55 msg_dialog = MDDialog( text=msg, - title='', size_hint=(.8, .25), text_button_ok='Ok', + title='', size_hint=(width, .25), text_button_ok='Ok', events_callback=self.callback_for_menu_items) msg_dialog.open() @@ -702,13 +710,14 @@ class DropDownWidget(BoxLayout): class MyTextInput(TextInput): """Takes the text input in the field""" + txt_input = ObjectProperty() flt_list = ObjectProperty() word_list = ListProperty() starting_no = NumericProperty(3) suggestion_text = '' - def __init__(self, **kwargs): # pylint: disable=useless-super-delegation + def __init__(self, **kwargs): # pylint: disable=useless-super-delegation """Getting Text Input.""" super(MyTextInput, self).__init__(**kwargs) @@ -757,12 +766,14 @@ class Payment(Screen): class Credits(Screen): - """Credits Module""" - available_credits = StringProperty('{0}'.format('0')) + """Credits Method""" + available_credits = StringProperty( + '{0}'.format('0')) class Login(Screen): """Login Screeen""" + pass @@ -802,6 +813,7 @@ class NetworkStat(Screen): class ContentNavigationDrawer(Navigatorss): """Navigate Content Drawer""" + # pylint: disable=too-many-arguments pass @@ -872,7 +884,7 @@ class Sent(Screen): account = StringProperty() def __init__(self, *args, **kwargs): - """Association with the screen.""" + """Association with the screen""" super(Sent, self).__init__(*args, **kwargs) if state.association == '': if BMConfigParser().addresses(): @@ -885,7 +897,7 @@ class Sent(Screen): print(dt) def loadSent(self, where="", what=""): - """Load Sent list for Sent messages.""" + """Load Sent list for Sent messages""" self.account = state.association if state.searcing_text: self.ids.scroll_y.scroll_y = 1.0 @@ -893,8 +905,10 @@ class Sent(Screen): what = state.searcing_text xAddress = 'fromaddress' data = [] + self.ids.identi_tag.children[0].text = '' self.sentDataQuery(xAddress, where, what) if self.queryreturn: + self.ids.identi_tag.children[0].text = 'Sent' self.set_sentCount(state.sent_count) for mail in self.queryreturn: data.append({ @@ -923,7 +937,7 @@ class Sent(Screen): self.queryreturn = kivy_helper_search.search_sql( xAddress, self.account, - "sent", + 'sent', where, what, False, @@ -1056,6 +1070,8 @@ class Sent(Screen): state.sent_count = str(int(state.sent_count) - 1) state.trash_count = str(int(state.trash_count) + 1) state.all_count = str(int(state.all_count) - 1) + if int(state.sent_count) <= 0: + self.ids.identi_tag.children[0].text = '' sqlExecute( "UPDATE sent SET folder = 'trash'" " WHERE ackdata = ?;", data_index) @@ -1089,7 +1105,7 @@ class Trash(Screen): """Trash Screen uses screen to show widgets of screens""" trash_messages = ListProperty() has_refreshed = True - delete_index = StringProperty() + # delete_index = StringProperty() table_name = StringProperty() def __init__(self, *args, **kwargs): @@ -1098,12 +1114,14 @@ class Trash(Screen): Clock.schedule_once(self.init_ui, 0) def init_ui(self, dt=0): - """Clock Schdule for method trash screen.""" + """Clock Schdule for method trash screen""" if state.association == '': if BMConfigParser().addresses(): state.association = BMConfigParser().addresses()[0] + self.ids.identi_tag.children[0].text = '' self.trashDataQuery(0, 20) if self.trash_messages: + self.ids.identi_tag.children[0].text = 'Trash' src_mng_obj = state.kivyapp.root.children[2].children[0].ids src_mng_obj.trash_cnt.badge_text = state.trash_count self.set_mdList() @@ -1194,17 +1212,18 @@ class Trash(Screen): def delete_confirmation(self): """Show confirmation delete popup""" + width = .8 if platform == 'android' else .55 delete_msg_dialog = MDDialog( text='Are you sure you want to delete this' ' message permanently from trash?', title='', - size_hint=(.8, .25), + size_hint=(width, .25), text_button_ok='Yes', text_button_cancel='No', events_callback=self.callback_for_delete_msg) delete_msg_dialog.open() - def callback_for_delete_msg(self, text_item): + def callback_for_delete_msg(self, text_item, *arg): """Getting the callback of alert box""" if text_item == 'Yes': self.delete_message_from_trash() @@ -1215,11 +1234,9 @@ class Trash(Screen): """Deleting message from trash""" self.children[1].active = True if self.table_name == 'inbox': - sqlExecute("DELETE FROM inbox WHERE msgid = ?;", str( - self.delete_index)) + sqlExecute("DELETE FROM inbox WHERE msgid = ?;", self.delete_index) elif self.table_name == 'sent': - sqlExecute("DELETE FROM sent WHERE ackdata = ?;", str( - self.delete_index)) + sqlExecute("DELETE FROM sent WHERE ackdata = ?;", self.delete_index) msg_count_objs = state.kivyapp.root.children[2].children[0].ids if int(state.trash_count) > 0: msg_count_objs.trash_cnt.badge_text = str( @@ -1230,6 +1247,7 @@ class Trash(Screen): class Page(Screen): """Page Screen show widgets of page""" + pass @@ -1249,6 +1267,7 @@ class Create(Screen): class Setting(Screen): """Setting the Screen components""" + pass @@ -1261,6 +1280,7 @@ class NavigateApp(App): # pylint: disable=too-many-public-methods nav_drawer = ObjectProperty() state.screen_density = Window.size window_size = state.screen_density + app_platform = platform title = "PyBitmessage" imgstatus = False count = 0 @@ -1283,7 +1303,6 @@ class NavigateApp(App): # pylint: disable=too-many-public-methods def build(self): """Method builds the widget""" - print("SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSss") print(os.path.join(os.path.dirname(__file__), 'main.kv')) main_widget = Builder.load_file( os.path.join(os.path.dirname(__file__), 'main.kv')) @@ -1327,12 +1346,12 @@ class NavigateApp(App): # pylint: disable=too-many-public-methods Clock.schedule_once(self.setCurrentAccountData, 0.5) def setCurrentAccountData(self, dt=0): - """This method set the current accout data on all the screens.""" + """This method set the current accout data on all the screens""" self.root.ids.sc1.ids.ml.clear_widgets() self.root.ids.sc1.loadMessagelist(state.association) self.root.ids.sc4.ids.ml.clear_widgets() - self.root.ids.sc4.children[2].children[1].ids.search_field.text = '' + self.root.ids.sc4.children[2].children[2].ids.search_field.text = '' self.root.ids.sc4.loadSent(state.association) self.root.ids.sc16.clear_widgets() @@ -1385,7 +1404,7 @@ class NavigateApp(App): # pylint: disable=too-many-public-methods if not os.path.exists(directory): os.makedirs(directory) except OSError: - print ('Error: Creating directory. ' + directory) + print('Error: Creating directory. ' + directory) @staticmethod def get_default_image(): @@ -1586,7 +1605,7 @@ class NavigateApp(App): # pylint: disable=too-many-public-methods @staticmethod def on_stop(): """On stop methos is used for stoping the runing script""" - print ("*******************EXITING FROM APPLICATION*******************") + print("*******************EXITING FROM APPLICATION*******************") import shutdown shutdown.doCleanShutdown() @@ -1636,30 +1655,30 @@ class NavigateApp(App): # pylint: disable=too-many-public-methods if state.search_screen == 'inbox': try: self.root.ids.sc1.children[ - 3].children[1].ids.search_field.text = '' + 3].children[2].ids.search_field.text = '' except Exception: self.root.ids.sc1.children[ - 2].children[1].ids.search_field.text = '' + 2].children[2].ids.search_field.text = '' self.root.ids.sc1.children[1].active = True Clock.schedule_once(self.search_callback, 0.5) elif state.search_screen == 'addressbook': self.root.ids.sc11.children[ - 2].children[1].ids.search_field.text = '' + 2].children[2].ids.search_field.text = '' self.root.ids.sc11.children[ 1].active = True Clock.schedule_once(self.search_callback, 0.5) elif state.search_screen == 'myaddress': try: self.root.ids.sc10.children[ - 3].children[1].ids.search_field.text = '' + 3].children[2].ids.search_field.text = '' except Exception: self.root.ids.sc10.children[ - 2].children[1].ids.search_field.text = '' + 2].children[2].ids.search_field.text = '' self.root.ids.sc10.children[1].active = True Clock.schedule_once(self.search_callback, 0.5) else: self.root.ids.sc4.children[ - 2].children[1].ids.search_field.text = '' + 2].children[2].ids.search_field.text = '' self.root.ids.sc4.children[1].active = True Clock.schedule_once(self.search_callback, 0.5) return @@ -1699,7 +1718,7 @@ class NavigateApp(App): # pylint: disable=too-many-public-methods self.root.ids.scr_mngr.current = 'allmails' try: self.root.ids.sc17.children[1].active = True - except Exception as e: + except Exception: self.root.ids.sc17.children[0].children[1].active = True Clock.schedule_once(partial(self.load_screen_callback, instance), 1) @@ -1710,11 +1729,15 @@ class NavigateApp(App): # pylint: disable=too-many-public-methods self.root.ids.sc1.loadMessagelist(state.association) self.root.ids.sc1.children[1].active = False elif instance.text == 'All Mails': - self.root.ids.sc17.clear_widgets() - self.root.ids.sc17.add_widget(Allmails()) + if len(self.root.ids.sc17.ids.ml.children) <= 2: + self.root.ids.sc17.clear_widgets() + self.root.ids.sc17.add_widget(Allmails()) + else: + self.root.ids.sc17.ids.ml.clear_widgets() + self.root.ids.sc17.loadMessagelist() try: self.root.ids.sc17.children[1].active = False - except Exception as e: + except Exception: self.root.ids.sc17.children[0].children[1].active = False @@ -1753,26 +1776,6 @@ class GrashofPopup(Popup): self.parent.children[1].ids.scr_mngr.current = 'addressbook' toast('Saved') - # pylint: disable=attribute-defined-outside-init - def show_error_message(self): - """Showing error message""" - content = MDLabel( - font_style='Body1', - theme_text_color='Secondary', - text="Hey you are not allowed to save blank address contact. " - "That's wrong!", - size_hint_y=None, - valign='top') - content.bind(texture_size=content.setter('size')) - self.dialog = MDDialog(content=content, - size_hint=(.8, None), - height=dp(200), - auto_dismiss=False) - - self.dialog.add_action_button("ok", - action=lambda *x: self.dialog.dismiss()) - self.dialog.open() - @staticmethod def close_pop(): """Pop is Canceled""" @@ -1834,8 +1837,7 @@ class GrashofPopup(Popup): elif status == 'checksumfailed': text = "The address is not typed or copied correctly(the checksum failed)." elif status == 'versiontoohigh': - text = "The version number of this address is higher"\ - " than this software can support. Please upgrade Bitmessage." + text = "The version number of this address is higher than this software can support. Please upgrade Bitmessage." elif status == 'invalidcharacters': text = "The address contains invalid characters." elif status == 'ripetooshort': @@ -1849,22 +1851,26 @@ class GrashofPopup(Popup): class AvatarSampleWidget(ILeftBody, Image): """Avatar Sample Widget""" + pass class IconLeftSampleWidget(ILeftBodyTouch, MDIconButton): """Left icon sample widget""" + pass class IconRightSampleWidget(IRightBodyTouch, MDCheckbox): """Right icon sample widget""" + pass class NavigationDrawerTwoLineListItem( TwoLineListItem, NavigationDrawerHeaderBase): """Navigation Drawer in Listitems""" + address_property = StringProperty() def __init__(self, **kwargs): @@ -1940,7 +1946,7 @@ class MailDetail(Screen): self.children[0].children[0].active = True if state.detailPageType == 'sent': state.kivyapp.root.ids.sc4.children[ - 2].children[1].ids.search_field.text = '' + 2].children[2].ids.search_field.text = '' sqlExecute( "UPDATE sent SET folder = 'trash' WHERE" " ackdata = ?;", state.mail_id) @@ -1950,12 +1956,12 @@ class MailDetail(Screen): self.parent.screens[3].loadSent(state.association) elif state.detailPageType == 'inbox': state.kivyapp.root.ids.sc1.children[ - 2].children[1].ids.search_field.text = '' + 2].children[2].ids.search_field.text = '' self.parent.screens[0].children[2].children[ - 1].ids.search_field.text = '' + 2].ids.search_field.text = '' sqlExecute( "UPDATE inbox SET folder = 'trash' WHERE" - " msgid = ?;", str(state.mail_id)) + " msgid = ?;", state.mail_id) msg_count_objs.inbox_cnt.badge_text = str( int(state.inbox_count) - 1) state.inbox_count = str(int(state.inbox_count) - 1) @@ -1963,8 +1969,7 @@ class MailDetail(Screen): self.parent.screens[0].loadMessagelist(state.association) elif state.detailPageType == 'draft': - sqlExecute("DELETE FROM sent WHERE ackdata = ?;", str( - state.mail_id)) + sqlExecute("DELETE FROM sent WHERE ackdata = ?;", state.mail_id) msg_count_objs.draft_cnt.badge_text = str( int(state.draft_count) - 1) state.draft_count = str(int(state.draft_count) - 1) @@ -1982,8 +1987,8 @@ class MailDetail(Screen): state.all_count = str(int(state.all_count) - 1) self.parent.screens[4].clear_widgets() self.parent.screens[4].add_widget(Trash()) - self.parent.screens[16].ids.ml.clear_widgets() - self.parent.screens[16].init_ui(dt=0) + self.parent.screens[16].clear_widgets() + self.parent.screens[16].add_widget(Allmails()) Clock.schedule_once(self.callback_for_delete, 4) def callback_for_delete(self, dt=0): @@ -1999,7 +2004,7 @@ class MailDetail(Screen): """Reply inbox messages""" data = sqlQuery( "select toaddress, fromaddress, subject, message from inbox where" - " msgid = ?;", str(state.mail_id)) + " msgid = ?;", state.mail_id) composer_obj = self.parent.screens[2].children[1].ids composer_obj.ti.text = data[0][0] composer_obj.btn.text = data[0][0] @@ -2138,7 +2143,7 @@ class ShowQRCode(Screen): """ShowQRCode Screen uses to show the detail of mails""" def qrdisplay(self): - """Showing QR Code""" + """Method used for showing QR Code""" # self.manager.parent.parent.parent.ids.search_bar.clear_widgets() self.ids.qr.clear_widgets() from kivy.garden.qrcode import QRCodeWidget @@ -2168,18 +2173,20 @@ class Draft(Screen): print(dt) def sentaccounts(self): - """Load draft accounts.""" + """Load draft accounts""" self.account = state.association self.loadDraft() def loadDraft(self, where="", what=""): - """Load draft list for Draft messages.""" + """Load draft list for Draft messages""" xAddress = 'fromaddress' + self.ids.identi_tag.children[0].text = '' self.draftDataQuery(xAddress, where, what) if state.msg_counter_objs: state.msg_counter_objs.draft_cnt.badge_text = str( len(self.queryreturn)) if self.queryreturn: + self.ids.identi_tag.children[0].text = 'Draft' src_mng_obj = state.kivyapp.root.children[2].children[0].ids src_mng_obj.draft_cnt.badge_text = state.draft_count self.set_mdList() @@ -2276,12 +2283,10 @@ class Draft(Screen): def delete_draft(self, data_index, instance, *args): """Delete draft message permanently""" - sqlExecute("DELETE FROM sent WHERE ackdata = ?;", str( - data_index)) + sqlExecute("DELETE FROM sent WHERE ackdata = ?;", data_index) try: msg_count_objs = ( - self.parent.parent.parent.parent.parent.parent.children[ - 2].children[0].ids) + self.parent.parent.parent.parent.parent.children[2].children[0].ids) except Exception: msg_count_objs = self.parent.parent.parent.parent.parent.parent.children[ 2].children[0].ids @@ -2291,6 +2296,8 @@ class Draft(Screen): msg_count_objs.draft_cnt.badge_text = str( int(state.draft_count) - 1) state.draft_count = str(int(state.draft_count) - 1) + if int(state.draft_count) <= 0: + self.ids.identi_tag.children[0].text = '' self.ids.ml.remove_widget(instance.parent.parent) toast('Deleted') @@ -2305,7 +2312,9 @@ class Draft(Screen): encoding = 3 sendMessageToPeople = True if sendMessageToPeople: + from addresses import decodeAddress streamNumber, ripe = decodeAddress(toAddress)[2:] + from addresses import addBMIfNotPresent toAddress = addBMIfNotPresent(toAddress) stealthLevel = BMConfigParser().safeGetInt( 'bitmessagesettings', 'ackstealthlevel') @@ -2328,9 +2337,7 @@ class Draft(Screen): 0, 'draft', encoding, - int(BMConfigParser().safeGet( - 'bitmessagesettings', 'ttl'))) - + int(BMConfigParser().safeGet('bitmessagesettings', 'ttl'))) state.msg_counter_objs = src_object.children[2].children[0].ids state.draft_count = str(int(state.draft_count) + 1) src_object.ids.sc16.clear_widgets() @@ -2343,7 +2350,7 @@ class CustomSpinner(Spinner): """This class is used for setting spinner size""" def __init__(self, *args, **kwargs): - """Setting size of spinner""" + """Method used for setting size of spinner""" super(CustomSpinner, self).__init__(*args, **kwargs) self.dropdown_cls.max_height = Window.size[1] / 3 @@ -2356,7 +2363,7 @@ class Allmails(Screen): account = StringProperty() def __init__(self, *args, **kwargs): - """Method Parsing the address.""" + """Method Parsing the address""" super(Allmails, self).__init__(*args, **kwargs) if state.association == '': if BMConfigParser().addresses(): @@ -2366,13 +2373,15 @@ class Allmails(Screen): def init_ui(self, dt=0): """Clock Schdule for method all mails""" self.loadMessagelist() - print (dt) + print(dt) def loadMessagelist(self): - """Load Inbox, Sent anf Draft list of messages.""" + """Load Inbox, Sent anf Draft list of messages""" self.account = state.association + self.ids.identi_tag.children[0].text = '' self.allMessageQuery(0, 20) if self.all_mails: + self.ids.identi_tag.children[0].text = 'All Mails' state.kivyapp.get_inbox_count() state.kivyapp.get_sent_count() state.all_count = str( @@ -2502,6 +2511,8 @@ class Allmails(Screen): int(state.all_count) - 1) state.trash_count = str(int(state.trash_count) + 1) state.all_count = str(int(state.all_count) - 1) + if int(state.all_count) <= 0: + self.ids.identi_tag.children[0].text = '' nav_lay_obj.sc5.clear_widgets() nav_lay_obj.sc5.add_widget(Trash()) nav_lay_obj.sc17.remove_widget(instance.parent.parent) @@ -2547,16 +2558,19 @@ def avatarImageFirstLetter(letter_string): class Starred(Screen): """Starred Screen show widgets of page""" + pass class Archieve(Screen): """Archieve Screen show widgets of page""" + pass class Spam(Screen): """Spam Screen show widgets of page""" + pass @@ -2571,3 +2585,8 @@ class LoadingPopup(Popup): def dismiss_popup(self, dt): """Dismiss popups""" self.dismiss() + + +class AddressDropdown(OneLineIconListItem): + """AddressDropdown showns all the addresses""" + pass \ No newline at end of file diff --git a/src/bitmessagekivy/uikivysignaler.py b/src/bitmessagekivy/uikivysignaler.py index cb9473e2..aac45fd5 100644 --- a/src/bitmessagekivy/uikivysignaler.py +++ b/src/bitmessagekivy/uikivysignaler.py @@ -1,12 +1,15 @@ - +""" +Ui Singnaler for kivy interface +""" from threading import Thread -import state + import queues +import state from semaphores import kivyuisignaler -from helper_sql import SqlBulkExecute, sqlExecute, sqlQuery, sqlStoredProcedure class UIkivySignaler(Thread): + """Kivy ui signaler""" def run(self): kivyuisignaler.acquire() @@ -14,13 +17,12 @@ class UIkivySignaler(Thread): try: command, data = queues.UISignalQueue.get() if command == 'writeNewAddressToTable': - label, address, streamNumber = data + address = data[1] state.kivyapp.variable_1.append(address) # elif command == 'rerenderAddressBook': # state.kivyapp.obj_1.refreshs() # Need to discuss this elif command == 'updateSentItemStatusByAckdata': state.kivyapp.status_dispatching(data) - except Exception as e: print(e) diff --git a/src/bitmessagemain.py b/src/bitmessagemain.py index f269d6b9..a2522053 100755 --- a/src/bitmessagemain.py +++ b/src/bitmessagemain.py @@ -9,7 +9,6 @@ The PyBitmessage startup script # Right now, PyBitmessage only support connecting to stream 1. It doesn't # yet contain logic to expand into further streams. - import os import sys import ctypes @@ -30,7 +29,8 @@ import state import shutdown from bmconfigparser import BMConfigParser -from debug import logger # this should go before any threads +# this should go before any threads +from debug import logger from helper_startup import ( isOurOperatingSystemLimitedToHavingVeryFewHalfOpenConnections, start_proxyconfig @@ -157,11 +157,11 @@ def signal_handler(signum, frame): if shared.thisapp.daemon or not state.enableGUI: shutdown.doCleanShutdown() else: - print ('# Thread: {}({})'.format(thread.name, thread.ident)) + print('# Thread: {}({})'.format(thread.name, thread.ident)) for filename, lineno, name, line in traceback.extract_stack(frame): - print ("File: '{}', line {}, in {}" .format(filename, lineno, name)) + print("File: '{}', line {}, in {}" .format(filename, lineno, name)) if line: - print (' {}'.format(line.strip())) + print(' {}'.format(line.strip())) print('Unfortunately you cannot use Ctrl+C when running the UI \ because the UI captures the signal.') @@ -198,7 +198,8 @@ class Main(object): if os.path.isfile(os.path.join( state.appdata, 'unittest.lock')): daemon = True - state.enableGUI = False # run without a UI + # run without a UI + state.enableGUI = False # Fallback: in case when no api command was issued state.last_api_response = time.time() # Apply special settings @@ -214,7 +215,8 @@ class Main(object): ) if daemon: - state.enableGUI = False # run without a UI + # run without a UI + state.enableGUI = False # is the application already running? If yes then exit. if state.enableGUI and not state.curses and not state.kivy and not depends.check_pyqt(): @@ -245,11 +247,10 @@ class Main(object): set_thread_name("PyBitmessage") - state.dandelion = config.safeGetInt('network', 'dandelion') + state.dandelion = config.safeGet('network', 'dandelion') # dandelion requires outbound connections, without them, # stem objects will get stuck forever - if state.dandelion and not config.safeGetBoolean( - 'bitmessagesettings', 'sendoutgoingconnections'): + if state.dandelion and not (config.safeGet('bitmessagesettings', 'sendoutgoingconnections') == 'True'): state.dandelion = 0 if state.testmode or config.safeGetBoolean( @@ -261,7 +262,6 @@ class Main(object): readKnownNodes() - # Not needed if objproc is disabled if state.enableObjProc: @@ -320,7 +320,8 @@ class Main(object): shared.reloadBroadcastSendersForWhichImWatching() # API is also objproc dependent if config.safeGetBoolean('bitmessagesettings', 'apienabled'): - import api # pylint: disable=relative-import + # pylint: disable=relative-import + import api singleAPIThread = api.singleAPI() # close the main program even if there are threads left singleAPIThread.daemon = True @@ -409,13 +410,14 @@ class Main(object): while True: time.sleep(1) - os._exit(0) # pylint: disable=protected-access + os._exit(0) # pylint: disable=protected-access except AttributeError: # fork not implemented pass else: parentPid = os.getpid() - shared.thisapp.lock() # relock + # relock + shared.thisapp.lock() os.umask(0) try: @@ -430,14 +432,16 @@ class Main(object): # wait until child ready while True: time.sleep(1) - - os._exit(0) # pylint: disable=protected-access + # pylint: disable=protected-access + os._exit(0) except AttributeError: # fork not implemented pass else: - shared.thisapp.lock() # relock - shared.thisapp.lockPid = None # indicate we're the final child + # relock + shared.thisapp.lock() + # indicate we're the final child + shared.thisapp.lockPid = None sys.stdout.flush() sys.stderr.flush() if not sys.platform.startswith('win'): @@ -460,7 +464,6 @@ class Main(object): # signal.signal(signal.SIGINT, signal.SIG_DFL) @staticmethod - def usage(): """Displaying the usages""" print('Usage: ' + sys.argv[0] + ' [OPTIONS]') diff --git a/src/bmconfigparser.py b/src/bmconfigparser.py index 150333ec..3293c5b3 100644 --- a/src/bmconfigparser.py +++ b/src/bmconfigparser.py @@ -1,7 +1,7 @@ """ BMConfigParser class definition and default configuration settings """ - +# pylint: disable=no-self-use, arguments-differ import configparser import shutil import os @@ -45,7 +45,7 @@ BMConfigDefaults = { class BMConfigParser(configparser.ConfigParser): """Singleton class inherited from ConfigParsedadfeConfigParser with additional methods specific to bitmessage config.""" - + # pylint: disable=too-many-ancestors _temp = {} def set(self, section, option, value=None): @@ -56,7 +56,8 @@ class BMConfigParser(configparser.ConfigParser): raise ValueError("Invalid value %s" % value) return configparser.ConfigParser.set(self, section, option, value) - def get(self, section, option, raw=False, variables=None): # pylint: disable=arguments-differ + def get(self, section, option, raw=False, variables=None): + # pylint: disable=unused-argument try: if section == "bitmessagesettings" and option == "timeformat": return configparser.ConfigParser.get( @@ -84,24 +85,26 @@ class BMConfigParser(configparser.ConfigParser): self._temp[section] = {option: value} def safeGetBoolean(self, section, field): + """Return value as boolean, False on exceptions""" config = configparser.ConfigParser() - try: - #Used in the python2.7 + # Used in the python2.7 # return self.getboolean(section, field) - #Used in the python3.5.2 + # Used in the python3.5.2 return config.getboolean(section, field) except (configparser.NoSectionError, configparser.NoOptionError, ValueError, AttributeError): return False def safeGetInt(self, section, field, default=0): + """Return value as integer, default on exceptions, + 0 if default missing""" config = configparser.ConfigParser() try: - #Used in the python2.7 + # Used in the python2.7 # return self.getint(section, field) - #Used in the python3.5.2 + # Used in the python3.5.2 return config.getint(section, field) except (configparser.NoSectionError, configparser.NoOptionError, ValueError, AttributeError): @@ -116,12 +119,14 @@ class BMConfigParser(configparser.ConfigParser): return default def items(self, section, raw=False, variables=None): + """Return section variables as parent, + but override the "raw" argument to always True""" return configparser.ConfigParser.items(self, section, True, variables) def addresses(self): + """Return a list of local bitmessage addresses (from section labels)""" return [x for x in BMConfigParser().sections() if x.startswith('BM-')] - def read(self, filenames): configparser.ConfigParser.read(self, filenames) for section in self.sections(): @@ -167,7 +172,8 @@ class BMConfigParser(configparser.ConfigParser): def validate(self, section, option, value): """Input validator interface (using factory pattern)""" try: - return getattr(self, 'validate_{}_{}'.format(section, option))(value) + return getattr(self, 'validate_{}_{}'.format( + section, option))(value) except AttributeError: return True diff --git a/src/build_osx.py b/src/build_osx.py index 7ab74dc2..6618d5da 100644 --- a/src/build_osx.py +++ b/src/build_osx.py @@ -13,8 +13,14 @@ DATA_FILES = [ ('bitmsghash', ['bitmsghash/bitmsghash.cl', 'bitmsghash/bitmsghash.so']), ('translations', glob('translations/*.qm')), ('ui', glob('bitmessageqt/*.ui')), - ('translations', glob(str(QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.TranslationsPath)) + '/qt_??.qm')), - ('translations', glob(str(QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.TranslationsPath)) + '/qt_??_??.qm')), + ('translations', glob( + str( + QtCore.QLibraryInfo.location( + QtCore.QLibraryInfo.TranslationsPath)) + '/qt_??.qm')), + ('translations', glob( + str( + QtCore.QLibraryInfo.location( + QtCore.QLibraryInfo.TranslationsPath)) + '/qt_??_??.qm')), ] setup( diff --git a/src/class_addressGenerator.py b/src/class_addressGenerator.py index 8cd63099..1f60e051 100644 --- a/src/class_addressGenerator.py +++ b/src/class_addressGenerator.py @@ -20,7 +20,6 @@ from network.threads import StoppableThread class addressGenerator(StoppableThread): """A thread for creating addresses""" - name = "addressGenerator" def stopThread(self): @@ -35,7 +34,8 @@ class addressGenerator(StoppableThread): Process the requests for addresses generation from `.queues.addressGeneratorQueue` """ - # pylint: disable=too-many-locals, too-many-branches, protected-access, too-many-statements + # pylint: disable=too-many-locals, too-many-branches + # pylint: disable=protected-access, too-many-statements while state.shutdown == 0: queueValue = queues.addressGeneratorQueue.get() nonceTrialsPerByte = 0 @@ -140,7 +140,7 @@ class addressGenerator(StoppableThread): ripe = RIPEMD160Hash(sha.digest()).digest() if ( ripe[:numberOfNullBytesDemandedOnFrontOfRipeHash] == - '\x00'.encode('utf-8') * numberOfNullBytesDemandedOnFrontOfRipeHash + '\x00'.encode('utf-8') * numberOfNullBytesDemandedOnFrontOfRipeHash ): break self.logger.info( @@ -206,9 +206,14 @@ class addressGenerator(StoppableThread): queues.workerQueue.put(( 'sendOutOrStoreMyV4Pubkey', address)) - elif command == 'createDeterministicAddresses' \ - or command == 'getDeterministicAddress' \ - or command == 'createChan' or command == 'joinChan': + # elif command == 'createDeterministicAddresses' \ + # or command == 'getDeterministicAddress' \ + # or command == 'createChan' or command == 'joinChan': + elif command in ( + 'createDeterministicAddresses', + 'getDeterministicAddress', + 'createChan', + 'joinChan'): if not deterministicPassphrase: self.logger.warning( 'You are creating deterministic' @@ -333,8 +338,8 @@ class addressGenerator(StoppableThread): BMConfigParser().set(address, 'label', label) BMConfigParser().set(address, 'enabled', 'true') BMConfigParser().set(address, 'decoy', 'false') - if command == 'joinChan' \ - or command == 'createChan': + # if command == 'joinChan' or command == 'createChan': + if command in ('joinChan', 'createChan'): BMConfigParser().set(address, 'chan', 'true') BMConfigParser().set( address, 'noncetrialsperbyte', @@ -385,8 +390,12 @@ class addressGenerator(StoppableThread): address) # Done generating addresses. - if command == 'createDeterministicAddresses' \ - or command == 'joinChan' or command == 'createChan': + # if command == 'createDeterministicAddresses' \ + # or command == 'joinChan' or command == 'createChan': + if command in ( + 'createDeterministicAddresses', + 'joinChan', + 'createChan'): queues.apiAddressGeneratorReturnQueue.put( listOfNewAddressesToSendOutThroughTheAPI) elif command == 'getDeterministicAddress': diff --git a/src/class_objectProcessor.py b/src/class_objectProcessor.py index 2c741661..3e3261ad 100644 --- a/src/class_objectProcessor.py +++ b/src/class_objectProcessor.py @@ -34,7 +34,8 @@ import tr from fallback import RIPEMD160Hash import l10n -# pylint: disable=too-many-locals, too-many-return-statements, too-many-branches, too-many-statements +# pylint: disable=too-many-locals, too-many-return-statements +# pylint: disable=too-many-branches, too-many-statements logger = logging.getLogger('default') @@ -140,21 +141,20 @@ class objectProcessor(threading.Thread): # bypass nonce and time, retain object type/version/stream + body readPosition = 16 - if data[readPosition:] in shared.ackdataForWhichImWatching: + if bytes(data[readPosition:]) in shared.ackdataForWhichImWatching: logger.info('This object is an acknowledgement bound for me.') del shared.ackdataForWhichImWatching[data[readPosition:]] sqlExecute( 'UPDATE sent SET status=?, lastactiontime=?' ' WHERE ackdata=?', - 'ackreceived', int(time.time()), data[readPosition:]) + ' ackreceived', int(time.time()), data[readPosition:]) queues.UISignalQueue.put(( 'updateSentItemStatusByAckdata', (data[readPosition:], tr._translate( "MainWindow", - "Acknowledgement of the message received %1" - ).arg(l10n.formatTimestamp())) - )) + "Acknowledgement of the message received %1").arg( + l10n.formatTimestamp())))) else: logger.debug('This object is not an acknowledgement bound for me.') @@ -221,7 +221,7 @@ class objectProcessor(threading.Thread): 'the hash requested in this getpubkey request is: %s', hexlify(requestedHash)) # if this address hash is one of mine - if requestedHash in shared.myAddressesByHash: + if bytes(requestedHash) in shared.myAddressesByHash: myAddress = shared.myAddressesByHash[requestedHash] elif requestedAddressVersionNumber >= 4: requestedTag = data[readPosition:readPosition + 32] @@ -233,7 +233,7 @@ class objectProcessor(threading.Thread): logger.debug( 'the tag requested in this getpubkey request is: %s', hexlify(requestedTag)) - if requestedTag in shared.myAddressesByTag: + if bytes(requestedTag) in shared.myAddressesByTag: myAddress = shared.myAddressesByTag[requestedTag] if myAddress == '': @@ -328,7 +328,7 @@ class objectProcessor(threading.Thread): dataToStore = data[20:readPosition] sha = hashlib.new('sha512') sha.update( - '\x04' + publicSigningKey + '\x04' + publicEncryptionKey) + '\x04'.encode() + publicSigningKey + '\x04'.encode() + publicEncryptionKey) ripe = RIPEMD160Hash(sha.digest()).digest() if logger.isEnabledFor(logging.DEBUG): @@ -367,9 +367,9 @@ class objectProcessor(threading.Thread): ' Sanity check failed.') return readPosition += 4 - publicSigningKey = '\x04' + data[readPosition:readPosition + 64] + publicSigningKey = ('\x04').encode() + data[readPosition:readPosition + 64] readPosition += 64 - publicEncryptionKey = '\x04' + data[readPosition:readPosition + 64] + publicEncryptionKey = ('\x04').encode() + data[readPosition:readPosition + 64] readPosition += 64 _, specifiedNonceTrialsPerByteLength = decodeVarint( data[readPosition:readPosition + 10]) @@ -433,7 +433,7 @@ class objectProcessor(threading.Thread): return tag = data[readPosition:readPosition + 32] - if tag not in state.neededPubkeys: + if tag not in bytes(state.neededPubkeys): logger.info( 'We don\'t need this v4 pubkey. We didn\'t ask for it.') return @@ -645,7 +645,8 @@ class objectProcessor(threading.Thread): if decodeAddress(toAddress)[1] >= 3 \ and not BMConfigParser().safeGetBoolean(toAddress, 'chan'): # If I'm not friendly with this person: - if not shared.isAddressInMyAddressBookSubscriptionsListOrWhitelist(fromAddress): + if not shared.isAddressInMyAddressBookSubscriptionsListOrWhitelist( + fromAddress): requiredNonceTrialsPerByte = BMConfigParser().getint( toAddress, 'noncetrialsperbyte') requiredPayloadLengthExtraBytes = BMConfigParser().getint( @@ -865,7 +866,7 @@ class objectProcessor(threading.Thread): elif broadcastVersion == 5: embeddedTag = data[readPosition:readPosition + 32] readPosition += 32 - if embeddedTag not in shared.MyECSubscriptionCryptorObjects: + if bytes(embeddedTag) not in shared.MyECSubscriptionCryptorObjects: logger.debug('We\'re not interested in this broadcast.') return # We are interested in this broadcast because of its tag. diff --git a/src/class_objectProcessorQueue.py b/src/class_objectProcessorQueue.py deleted file mode 100644 index 24c24023..00000000 --- a/src/class_objectProcessorQueue.py +++ /dev/null @@ -1,24 +0,0 @@ -import queue as Queue -import threading -import time - -class ObjectProcessorQueue(Queue.Queue): - maxSize = 32000000 - - def __init__(self): - Queue.Queue.__init__(self) - self.sizeLock = threading.Lock() - self.curSize = 0 # in Bytes. We maintain this to prevent nodes from flooing us with objects which take up too much memory. If this gets too big we'll sleep before asking for further objects. - - def put(self, item, block = True, timeout = None): - while self.curSize >= self.maxSize: - time.sleep(1) - with self.sizeLock: - self.curSize += len(item[1]) - Queue.Queue.put(self, item, block, timeout) - - def get(self, block = True, timeout = None): - item = Queue.Queue.get(self, block, timeout) - with self.sizeLock: - self.curSize -= len(item[1]) - return item diff --git a/src/class_singleCleaner.py b/src/class_singleCleaner.py index f5442837..3c905b22 100644 --- a/src/class_singleCleaner.py +++ b/src/class_singleCleaner.py @@ -35,6 +35,7 @@ from inventory import Inventory from network.connectionpool import BMConnectionPool from network.threads import StoppableThread + class singleCleaner(StoppableThread): """The singleCleaner thread class""" name = "singleCleaner" @@ -200,6 +201,10 @@ def deleteTrashMsgPermonantly(): """This method is used to delete old messages""" ndays_before_time = datetime.now() - timedelta(days=30) old_messages = time.mktime(ndays_before_time.timetuple()) - sqlExecute("delete from sent where folder = 'trash' and lastactiontime <= ?;", int(old_messages)) - sqlExecute("delete from inbox where folder = 'trash' and received <= ?;", int(old_messages)) + sqlExecute( + "delete from sent where folder = 'trash' and lastactiontime <= ?;", + int(old_messages)) + sqlExecute( + "delete from inbox where folder = 'trash' and received <= ?;", + int(old_messages)) return diff --git a/src/class_singleWorker.py b/src/class_singleWorker.py index 6f453feb..7c0b5842 100644 --- a/src/class_singleWorker.py +++ b/src/class_singleWorker.py @@ -23,7 +23,8 @@ import queues import shared import state import tr -from addresses import calculateInventoryHash, decodeAddress, decodeVarint, encodeVarint +from addresses import ( + calculateInventoryHash, decodeAddress, decodeVarint, encodeVarint) from bmconfigparser import BMConfigParser from helper_sql import sqlExecute, sqlQuery from inventory import Inventory diff --git a/src/class_smtpDeliver.py b/src/class_smtpDeliver.py index 58cd4631..6186f3ac 100644 --- a/src/class_smtpDeliver.py +++ b/src/class_smtpDeliver.py @@ -3,7 +3,6 @@ src/class_smtpDeliver.py ======================== """ # pylint: disable=unused-variable - import smtplib import urlparse from email.header import Header @@ -24,7 +23,8 @@ class smtpDeliver(StoppableThread): def stopThread(self): try: - queues.UISignallerQueue.put(("stopThread", "data")) # pylint: disable=no-member + # pylint: disable=no-member + queues.UISignallerQueue.put(("stopThread", "data")) except: pass super(smtpDeliver, self).stopThread() @@ -50,23 +50,27 @@ class smtpDeliver(StoppableThread): ackData, message = data elif command == 'displayNewInboxMessage': inventoryHash, toAddress, fromAddress, subject, body = data - dest = BMConfigParser().safeGet("bitmessagesettings", "smtpdeliver", '') + dest = BMConfigParser().safeGet( + "bitmessagesettings", "smtpdeliver", '') if dest == '': continue try: + # pylint: disable=deprecated-lambda u = urlparse.urlparse(dest) to = urlparse.parse_qs(u.query)['to'] client = smtplib.SMTP(u.hostname, u.port) msg = MIMEText(body, 'plain', 'utf-8') msg['Subject'] = Header(subject, 'utf-8') msg['From'] = fromAddress + '@' + SMTPDOMAIN - toLabel = map( # pylint: disable=deprecated-lambda + toLabel = map( lambda y: BMConfigParser().safeGet(y, "label"), - filter( # pylint: disable=deprecated-lambda + filter( lambda x: x == toAddress, BMConfigParser().addresses()) ) if toLabel: - msg['To'] = "\"%s\" <%s>" % (Header(toLabel[0], 'utf-8'), toAddress + '@' + SMTPDOMAIN) + msg['To'] = "\"%s\" <%s>" % ( + Header(toLabel[0], 'utf-8'), + toAddress + '@' + SMTPDOMAIN) else: msg['To'] = toAddress + '@' + SMTPDOMAIN client.ehlo() @@ -80,7 +84,8 @@ class smtpDeliver(StoppableThread): except: self.logger.error('smtp delivery error', exc_info=True) elif command == 'displayNewSentMessage': - toAddress, fromLabel, fromAddress, subject, message, ackdata = data + toAddress, fromLabel, fromAddress, subject, message, ackdata = \ + data elif command == 'updateNetworkStatusTab': pass elif command == 'updateNumberOfMessagesProcessed': diff --git a/src/class_smtpServer.py b/src/class_smtpServer.py index cdf867a9..013420cd 100644 --- a/src/class_smtpServer.py +++ b/src/class_smtpServer.py @@ -114,8 +114,9 @@ class smtpServerPyBitmessage(smtpd.SMTPServer): return ret - def process_message(self, peer, mailfrom, rcpttos, data): # pylint: disable=too-many-locals, too-many-branches + def process_message(self, peer, mailfrom, rcpttos, data): """Process an email""" + # pylint: disable=too-many-locals, too-many-branches # print 'Receiving message from:', peer p = re.compile(".*<([^>]+)>") if not hasattr(self.channel, "auth") or not self.channel.auth: diff --git a/src/class_sqlThread.py b/src/class_sqlThread.py index d0d8a001..d7bb158f 100644 --- a/src/class_sqlThread.py +++ b/src/class_sqlThread.py @@ -214,7 +214,8 @@ class sqlThread(threading.Thread): parameters = '' self.cur.execute(item, parameters) currentVersion = int(self.cur.fetchall()[0][0]) - if currentVersion == 1 or currentVersion == 3: + # if currentVersion == 1 or currentVersion == 3: + if currentVersion in (1, 3): logger.debug( 'In messages.dat database, adding tag field to' ' the inventory table.') @@ -572,23 +573,10 @@ class sqlThread(threading.Thread): rowcount = 0 # print 'item', item # print 'parameters', parameters - # print('++++454++++++++++++++++++++++++') - # print ('parameters') - # print (parameters) - # print ('+++++++++++++++++++++++++++++') - try: - if 'sent' == parameters[1] and 'B' in parameters[0]: - item = '''SELECT toaddress, fromaddress, subject, message, status, ackdata, lastactiontime FROM sent WHERE fromaddress = ? ORDER BY lastactiontime DESC ''' - parameters = (parameters[0],) - except (IndexError,TypeError) as e: - pass try: self.cur.execute(item, parameters) rowcount = self.cur.rowcount except Exception as err: - print('@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@') - print('inside the expectation') - print('@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@') if str(err) == 'database or disk is full': logger.fatal( '(while cur.execute) Alert: Your disk or data storage volume is full.' diff --git a/src/debug.py b/src/debug.py index 685844ab..99994d22 100644 --- a/src/debug.py +++ b/src/debug.py @@ -151,7 +151,7 @@ def resetLogging(): try: preconfigured, msg = configureLogging() if msg: - logger.log(logging.WARNING if preconfigured else logging.INFO, msg) + logger.log(logging.WARNING if preconfigured else logging.INFO, msg) except: pass diff --git a/src/depends.py b/src/depends.py index 8182fca3..ead33cae 100755 --- a/src/depends.py +++ b/src/depends.py @@ -231,12 +231,13 @@ def check_sqlite(): conn.close() -def check_openssl(): # pylint: disable=too-many-branches, too-many-return-statements +def check_openssl(): """Do openssl dependency check. Here we are checking for openssl with its all dependent libraries and version checking. """ + # pylint: disable=too-many-branches, too-many-return-statements # pylint: disable=protected-access, redefined-outer-name ctypes = try_import('ctypes') if not ctypes: @@ -365,6 +366,7 @@ def check_pyqt(): Here we are checking for PyQt4 with its version, as for it require PyQt 4.8 or later. """ + QtCore = try_import( 'PyQt4.QtCore', 'PyBitmessage requires PyQt 4.8 or later and Qt 4.7 or later.') diff --git a/src/helper_ackPayload.py b/src/helper_ackPayload.py index dcce3153..2f89d540 100644 --- a/src/helper_ackPayload.py +++ b/src/helper_ackPayload.py @@ -22,7 +22,7 @@ def genAckPayload(streamNumber=1, stealthLevel=0): - level 1: a getpubkey request for a (random) dummy key hash - level 2: a standard message, encrypted to a random pubkey """ - if stealthLevel == 2: # Generate privacy-enhanced payload + if stealthLevel == 2: # Generate privacy-enhanced payload # Generate a dummy privkey and derive the pubkey dummyPubKeyHex = highlevelcrypto.privToPub( hexlify(helper_random.randomBytes(32))) @@ -35,12 +35,12 @@ def genAckPayload(streamNumber=1, stealthLevel=0): acktype = 2 # message version = 1 - elif stealthLevel == 1: # Basic privacy payload (random getpubkey) + elif stealthLevel == 1: # Basic privacy payload (random getpubkey) ackdata = helper_random.randomBytes(32) acktype = 0 # getpubkey version = 4 - else: # Minimum viable payload (non stealth) + else: # Minimum viable payload (non stealth) ackdata = helper_random.randomBytes(32) acktype = 2 # message version = 1 diff --git a/src/helper_bitcoin.py b/src/helper_bitcoin.py index 695bdbcf..d4f1d105 100644 --- a/src/helper_bitcoin.py +++ b/src/helper_bitcoin.py @@ -53,3 +53,4 @@ def calculateTestnetAddressFromPubkey(pubkey): numberOfZeroBytesOnBinaryBitcoinAddress += 1 binaryBitcoinAddress = binaryBitcoinAddress[1:] base58encoded = arithmetic.changebase(binaryBitcoinAddress, 256, 58) + return "1" * numberOfZeroBytesOnBinaryBitcoinAddress + base58encoded diff --git a/src/helper_search.py b/src/helper_search.py index 69acec43..2384ff01 100644 --- a/src/helper_search.py +++ b/src/helper_search.py @@ -7,6 +7,7 @@ try: haveQt = True except ImportError: haveQt = False +# pylint: disable=too-many-arguments def search_translate(context, text): @@ -18,7 +19,7 @@ def search_translate(context, text): def search_sql(xAddress="toaddress", account=None, folder="inbox", where=None, what=None, unreadOnly=False): """Perform a search in mailbox tables""" - # pylint: disable=too-many-arguments, too-many-branches + # pylint: disable=too-many-branches if what is not None and what != "": what = "%" + what + "%" if where == search_translate("MainWindow", "To"): @@ -75,7 +76,6 @@ def search_sql(xAddress="toaddress", account=None, folder="inbox", where=None, w def check_match(toAddress, fromAddress, subject, message, where=None, what=None): """Check if a single message matches a filter (used when new messages are added to messagelists)""" - # pylint: disable=too-many-arguments if what is not None and what != "": if where in (search_translate("MainWindow", "To"), search_translate("MainWindow", "All")): if what.lower() not in toAddress.lower(): diff --git a/src/helper_sent.py b/src/helper_sent.py index 5a345fe7..47fc5bb4 100644 --- a/src/helper_sent.py +++ b/src/helper_sent.py @@ -1,8 +1,8 @@ """ Insert values into sent table """ +from helper_sql import sqlExecute -from helper_sql import * def insert(t): """Perform an insert into the `sent` table""" diff --git a/src/helper_sql.py b/src/helper_sql.py index a13747e2..f848ee24 100644 --- a/src/helper_sql.py +++ b/src/helper_sql.py @@ -101,7 +101,7 @@ def sqlStoredProcedure(procName): sqlLock.release() -class SqlBulkExecute(object): +class SqlBulkExecute(object): # pylint: disable=no-init """This is used when you have to execute the same statement in a cycle.""" def __enter__(self): diff --git a/src/helper_startup.py b/src/helper_startup.py index d8106680..997e58e3 100644 --- a/src/helper_startup.py +++ b/src/helper_startup.py @@ -3,9 +3,7 @@ Startup operations. """ # pylint: disable=too-many-branches,too-many-statements -# import configparser import logging - import os import platform import sys @@ -30,6 +28,7 @@ logger = logging.getLogger('default') # the config files to stay in the application data folder. StoreConfigFilesInSameDirectoryAsProgramByDefault = False + def loadConfig(): """Load the config""" config = BMConfigParser() @@ -127,7 +126,6 @@ def loadConfig(): updateConfig() - def updateConfig(): """Save the config""" config = BMConfigParser() diff --git a/src/inventory.py b/src/inventory.py index 4b9ad226..fc06e455 100644 --- a/src/inventory.py +++ b/src/inventory.py @@ -1,8 +1,8 @@ """The Inventory singleton""" # TODO make this dynamic, and watch out for frozen, like with messagetypes -import storage.sqlite import storage.filesystem +import storage.sqlite from bmconfigparser import BMConfigParser from singleton import Singleton diff --git a/src/l10n.py b/src/l10n.py index a3237cb0..bf727244 100644 --- a/src/l10n.py +++ b/src/l10n.py @@ -64,25 +64,25 @@ else: # comprehensive decoding tests if time_format != DEFAULT_TIME_FORMAT: try: - #Check day names + # Check day names new_time_format = time_format import sys if sys.version_info >= (3, 0, 0) and time_format == '%%c': time_format = '%c' for i in range(7): - #this work for python2.7 + # this work for python2.7 # unicode(time.strftime(time_format, (0, 0, 0, 0, 0, 0, i, 0, 0)), encoding) - #this code for the python3 + # this code for the python3 (time.strftime(time_format, (0, 0, 0, 0, 0, 0, i, 0, 0))).encode() - #Check month names + # Check month names for i in range(1, 13): # unicode(time.strftime(time_format, (0, i, 0, 0, 0, 0, 0, 0, 0)), encoding) (time.strftime(time_format, (0, i, 0, 0, 0, 0, 0, 0, 0))).encode() - #Check AM/PM + # Check AM/PM (time.strftime(time_format, (0, 0, 0, 11, 0, 0, 0, 0, 0))).encode() (time.strftime(time_format, (0, 0, 0, 13, 0, 0, 0, 0, 0))).encode() - #Check DST + # Check DST (time.strftime(time_format, (0, 0, 0, 0, 0, 0, 0, 0, 1))).encode() except: diff --git a/src/network/__init__.py b/src/network/__init__.py index 77b80b5c..72865e87 100644 --- a/src/network/__init__.py +++ b/src/network/__init__.py @@ -1,13 +1,13 @@ -from .addrthread import AddrThread -from .announcethread import AnnounceThread -from .connectionpool import BMConnectionPool -from .dandelion import Dandelion -from .downloadthread import DownloadThread -from .invthread import InvThread -from .networkthread import BMNetworkThread -from .receivequeuethread import ReceiveQueueThread -from .threads import StoppableThread -from .uploadthread import UploadThread +from network.addrthread import AddrThread +from network.announcethread import AnnounceThread +from network.connectionpool import BMConnectionPool +from network.dandelion import Dandelion +from network.downloadthread import DownloadThread +from network.invthread import InvThread +from network.networkthread import BMNetworkThread +from network.receivequeuethread import ReceiveQueueThread +from network.threads import StoppableThread +from network.uploadthread import UploadThread __all__ = [ diff --git a/src/network/addrthread.py b/src/network/addrthread.py index 861da3ef..c041695f 100644 --- a/src/network/addrthread.py +++ b/src/network/addrthread.py @@ -1,4 +1,3 @@ -# import queue as Queue """ Announce addresses as they are received from other hosts """ diff --git a/src/network/advanceddispatcher.py b/src/network/advanceddispatcher.py index a21b946f..2eb0e46d 100644 --- a/src/network/advanceddispatcher.py +++ b/src/network/advanceddispatcher.py @@ -3,7 +3,6 @@ src/network/advanceddispatcher.py ================================= """ # pylint: disable=attribute-defined-outside-init -# import pdb;pdb.set_trace() import socket import threading import time @@ -32,7 +31,7 @@ class AdvancedDispatcher(asyncore.dispatcher): # python 2 below condition is used # if not hasattr(self, '_map'): # python 3 below condition is used - if not '_map' in dir(self): + if '_map' not in dir(self): asyncore.dispatcher.__init__(self, sock) self.read_buf = bytearray() self.write_buf = bytearray() diff --git a/src/network/announcethread.py b/src/network/announcethread.py index 938599d5..7929417e 100644 --- a/src/network/announcethread.py +++ b/src/network/announcethread.py @@ -11,7 +11,7 @@ from bmconfigparser import BMConfigParser from network.assemble import assemble_addr from network.connectionpool import BMConnectionPool from network.udp import UDPSocket -from .node import Peer +from network.node import Peer from network.threads import StoppableThread @@ -32,17 +32,15 @@ class AnnounceThread(StoppableThread): @staticmethod def announceSelf(): """Announce our presence""" - for connection in [ udpSockets for udpSockets in BMConnectionPool().udpSockets.values()]: + for connection in [udpSockets for udpSockets in BMConnectionPool().udpSockets.values()]: if not connection.announcing: continue for stream in state.streamsInWhichIAmParticipating: addr = ( stream, - - # state.Peer('127.0.0.1',int( BMConfigParser().safeGet("bitmessagesettings", "port"))), - # int(time.time())) - # connection.append_write_buf(BMProto.assembleAddr([addr])) - + # state.Peer('127.0.0.1',int( BMConfigParser().safeGet("bitmessagesettings", "port"))), + # int(time.time())) + # connection.append_write_buf(BMProto.assembleAddr([addr])) Peer( '127.0.0.1', BMConfigParser().safeGetInt('bitmessagesettings', 'port')), diff --git a/src/network/assemble.py b/src/network/assemble.py index 2d31914c..82f37533 100644 --- a/src/network/assemble.py +++ b/src/network/assemble.py @@ -13,7 +13,7 @@ from protocol import CreatePacket, encodeHost def assemble_addr(peerList): """Create address command""" if isinstance(peerList, Peer): - peerList = (peerList) + peerList = [peerList] if not peerList: return b'' retval = b'' @@ -22,7 +22,7 @@ def assemble_addr(peerList): len(peerList[i:i + MAX_ADDR_COUNT])) for stream, peer, timestamp in peerList[i:i + MAX_ADDR_COUNT]: payload += struct.pack( - '>Q', timestamp) # 64-bit time + '>Q', int(timestamp)) # 64-bit time payload += struct.pack('>I', stream) payload += struct.pack( '>q', 1) # service bit flags offered by this node diff --git a/src/network/asyncore_pollchoose.py b/src/network/asyncore_pollchoose.py index 3f6e8ad0..43bebdcf 100644 --- a/src/network/asyncore_pollchoose.py +++ b/src/network/asyncore_pollchoose.py @@ -102,7 +102,9 @@ def _strerror(err): return os.strerror(err) except (ValueError, OverflowError, NameError): if err in errorcode: - ret18 ("Unknown error {}".format(err)) + return errorcode[err] + return "Unknown error %s" % err + # ret18 ("Unknown error {}".format(err)) class ExitNow(Exception): @@ -477,7 +479,7 @@ def kqueue_poller(timeout=0.0, map=None): current_thread().stop.wait(timeout) -def loop(timeout=30.0, use_poll=False, map=None, count=None, poller=None): +def loop(timeout=30.0, _=False, map=None, count=None, poller=None): """Poll in a loop, until count or timeout is reached""" # pylint: disable=redefined-builtin @@ -518,7 +520,7 @@ def loop(timeout=30.0, use_poll=False, map=None, count=None, poller=None): count = count - 1 -class dispatcher: +class dispatcher(object): """Dispatcher for socket objects""" # pylint: disable=too-many-public-methods,too-many-instance-attributes,old-style-class @@ -786,7 +788,7 @@ class dispatcher: def log_info(self, message, log_type='info'): """Conditionally print a message""" if log_type not in self.ignore_log_types: - print ('{}: {}'.format(log_type, message)) + print('{}: {}'.format(log_type, message)) def handle_read_event(self): """Handle a read event""" diff --git a/src/network/bmproto.py b/src/network/bmproto.py index 12e26972..cd839a96 100644 --- a/src/network/bmproto.py +++ b/src/network/bmproto.py @@ -32,7 +32,7 @@ from network.bmobject import ( BMObjectInvalidError, BMObjectAlreadyHaveError) from network.proxy import ProxyError from network.objectracker import missingObjects, ObjectTracker -from .node import Node, Peer +from network.node import Node, Peer from queues import objectProcessorQueue, portCheckerQueue, invQueue, addrQueue from network.randomtrackingdict import RandomTrackingDict @@ -52,6 +52,7 @@ count = 0 logger = logging.getLogger('default') + class BMProtoError(ProxyError): """A Bitmessage Protocol Base Error""" errorCodes = ("Protocol error") @@ -94,30 +95,30 @@ class BMProto(AdvancedDispatcher, ObjectTracker): self.object = None def state_bm_header(self): - """Process incoming header""" self.magic, self.command, self.payloadLength, self.checksum = \ protocol.Header.unpack(self.read_buf[:protocol.Header.size]) - #its shoule be in string + # its shoule be in string self.command = self.command.rstrip('\x00'.encode('utf-8')) - global count,addr_version,addr_count,addr_verack - count+=1 + # pylint: disable=global-statement + global count, addr_version, addr_count, addr_verack + count += 1 if self.command == 'verack'.encode(): - addr_verack+=1 + addr_verack += 1 # print('the addr_verack count are -{}'.format(addr_verack)) if self.command == 'version'.encode(): - addr_version+=1 + addr_version += 1 # print('the addr_version count are -{}'.format(addr_version)) if self.command == 'addr'.encode(): - addr_count+=1 + addr_count += 1 # print('the addr_count count are -{}'.format(addr_count)) if self.magic != 0xE9BEB4D9: # skip 1 byte in order to sync - #in the advancedispatched and length commend's - #escape the 1 length + # in the advancedispatched and length commend's + # escape the 1 length self.set_state("bm_header", length=1) self.bm_proto_reset() logger.debug('Bad magic') @@ -132,7 +133,7 @@ class BMProto(AdvancedDispatcher, ObjectTracker): length=protocol.Header.size, expectBytes=self.payloadLength) return True - def state_bm_command(self): # pylint: disable=too-many-branches + def state_bm_command(self): # pylint: disable=too-many-branches, too-many-statements """Process incoming command""" self.payload = self.read_buf[:self.payloadLength] if self.checksum != hashlib.sha512(self.payload).digest()[0:4]: @@ -143,14 +144,14 @@ class BMProto(AdvancedDispatcher, ObjectTracker): "error".encode(), "version".encode(), "verack".encode()): logger.error( 'Received command {} before connection was fully' - ' established, ignoring'.format (self.command)) + ' established, ignoring'.format(self.command)) self.invalid = True if not self.invalid: try: command = self.command.decode() if self.command else self.command retval = getattr( - self, "bm_command_" +command)() + self, "bm_command_" + command)() except AttributeError: # unimplemented command logger.debug('unimplemented command %s', self.command) @@ -171,9 +172,11 @@ class BMProto(AdvancedDispatcher, ObjectTracker): except BMObjectAlreadyHaveError: logger.debug( '%(host)s:%(port)i already got object, skipping', - self.destination._asdict()) + self.destinaestion._asdict()) except struct.error: logger.debug('decoding error, skipping') + except ValueError: + pass elif self.socket.type == socket.SOCK_DGRAM: # broken read, ignore pass @@ -205,9 +208,9 @@ class BMProto(AdvancedDispatcher, ObjectTracker): """Decode node details from the payload""" # protocol.checkIPAddress() services, host, port = self.decode_payload_content("Q16sH") - if host[0:12] == '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF': + if host[0:12] == '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF'.encode('raw_unicode_escape'): host = socket.inet_ntop(socket.AF_INET, host[12:16]) - elif host[0:6] == '\xfd\x87\xd8\x7e\xeb\x43': + elif host[0:6] == '\xfd\x87\xd8\x7e\xeb\x43'.encode('raw_unicode_escape'): # Onion, based on BMD/bitcoind host = base64.b32encode(host[6:]).lower() + ".onion" else: @@ -346,8 +349,11 @@ class BMProto(AdvancedDispatcher, ObjectTracker): def bm_command_error(self): """Decode an error message and log it""" - fatalStatus, banTime, inventoryVector, errorText = \ - self.decode_payload_content("vvlsls") + err_values = self.decode_payload_content("vvlsls") + fatalStatus = err_values[0] + # banTime = err_values[1] + # inventoryVector = err_values[2] + errorText = err_values[3] logger.error( '%s:%i error: %i, %s', self.destination.host, self.destination.port, fatalStatus, errorText) @@ -359,7 +365,7 @@ class BMProto(AdvancedDispatcher, ObjectTracker): If we have them and some other conditions are fulfilled, append them to the write queue. """ - #32 an array bit long strings + # 32 an array bit long strings items = self.decode_payload_content("l32s") # skip? now = time.time() @@ -381,7 +387,7 @@ class BMProto(AdvancedDispatcher, ObjectTracker): if dandelion and not state.dandelion: return True - for i in map(str, items): + for i in map(bytes, items): if i in Inventory() and not Dandelion().hasHash(i): continue if dandelion and not Dandelion().hasHash(i): @@ -434,7 +440,7 @@ class BMProto(AdvancedDispatcher, ObjectTracker): try: self.object.checkObjectByType() objectProcessorQueue.put(( - self.object.objectType, buffer(self.object.data))) + self.object.objectType, memoryview(self.object.data))) except BMObjectInvalidError: BMProto.stopDownloadingObject(self.object.inventoryHash, True) else: @@ -445,12 +451,12 @@ class BMProto(AdvancedDispatcher, ObjectTracker): if self.object.inventoryHash in Inventory() and Dandelion().hasHash(self.object.inventoryHash): Dandelion().removeHash(self.object.inventoryHash, "cycle detection") - - Inventory()[self.object.inventoryHash] = ( + [self.object.inventoryHash] = ( self.object.objectType, self.object.streamNumber, - buffer(self.payload[objectOffset:]), self.object.expiresTime, - buffer(self.object.tag) + memoryview(self.payload[objectOffset:]), self.object.expiresTime, + memoryview(self.object.tag) ) + Inventory()[self.object.inventoryHash] self.handleReceivedObject( self.object.streamNumber, self.object.inventoryHash) invQueue.put(( @@ -463,11 +469,11 @@ class BMProto(AdvancedDispatcher, ObjectTracker): def bm_command_addr(self): # print('+++++++++++++++++++++++++++\ - # bm_command_addr bm_command_addr bm_command_addr ++++++++++++++++') + # bm_command_addr bm_command_addr bm_command_addr ++++++++++++++++') """Incoming addresses, process them""" addresses = self._decode_addr() # pylint: disable=redefined-outer-name for i in addresses: - seenTime, stream, services, ip, port = i + seenTime, stream, _, ip, port = i decodedIP = protocol.checkIPAddress(ip) if stream not in state.streamsInWhichIAmParticipating: continue @@ -533,6 +539,7 @@ class BMProto(AdvancedDispatcher, ObjectTracker): "tls_init" if self.isSSL else "connection_fully_established", length=self.payloadLength, expectBytes=0) return False + def bm_command_version(self): # print('inside the bmproto ') """ @@ -566,7 +573,7 @@ class BMProto(AdvancedDispatcher, ObjectTracker): logger.debug( '%(host)s:%(port)i sending version', self.destination._asdict()) - if ((self.services & protocol.NODE_SSL == protocol.NODE_SSL)): + if self.services & protocol.NODE_SSL == protocol.NODE_SSL: # self.isSSL = True pass if not self.verackReceived: @@ -625,7 +632,7 @@ class BMProto(AdvancedDispatcher, ObjectTracker): if not protocol.checkSocksIP(self.destination.host): self.append_write_buf(protocol.assembleErrorMessage( errorText="Too many connections from your IP." - " Closing connection.", fatal=2)) + " Closing connection.", fatal=2)) logger.debug( 'Closed connection to {} because we are already connected' ' to that IP.'.format(self.destination)) @@ -660,10 +667,8 @@ class BMProto(AdvancedDispatcher, ObjectTracker): "Closed connection to %s because I'm connected to myself.", self.destination) return False - return True - @staticmethod def stopDownloadingObject(hashId, forwardAnyway=False): """Stop downloading an object""" diff --git a/src/network/connectionchooser.py b/src/network/connectionchooser.py index 0e090b62..bd5b3d7d 100644 --- a/src/network/connectionchooser.py +++ b/src/network/connectionchooser.py @@ -39,7 +39,7 @@ def chooseConnection(stream): # discovered peers are already filtered by allowed streams return getDiscoveredPeer() for _ in range(50): - peer = random.choice([key for key in knownnodes.knownNodes[stream].keys()]) + peer = random.choice([key for key in knownnodes.knownNodes[stream].keys()]) try: peer_info = knownnodes.knownNodes[stream][peer] if peer_info.get('self'): diff --git a/src/network/connectionpool.py b/src/network/connectionpool.py index a9bbe2e7..4b9ab62b 100644 --- a/src/network/connectionpool.py +++ b/src/network/connectionpool.py @@ -17,11 +17,11 @@ from bmconfigparser import BMConfigParser from network.connectionchooser import chooseConnection from network.proxy import Proxy -from .node import Peer -from singleton import Singleton from network.tcp import ( - TCPServer, Socks5BMConnection, Socks4aBMConnection, TCPConnection,bootstrap) + TCPServer, Socks5BMConnection, Socks4aBMConnection, TCPConnection, bootstrap) from network.udp import UDPSocket +from singleton import Singleton +from .node import Peer logger = logging.getLogger('default') @@ -78,8 +78,8 @@ class BMConnectionPool(object): `inboundConnections` and `outboundConnections` dicts """ inboundConnections = [inboundConnections for inboundConnections in self.inboundConnections.values()] - outboundConnections = [outboundConnections for outboundConnections in self.outboundConnections.values()] - return [ connections for connections in inboundConnections +outboundConnections] + outboundConnections = [outboundConnections for outboundConnections in self.outboundConnections.values()] + return [connections for connections in inboundConnections + outboundConnections] def establishedConnections(self): """Shortcut for list of connections having fullyEstablished == True""" @@ -292,7 +292,7 @@ class BMConnectionPool(object): except ValueError: Proxy.onion_proxy = None established = sum( - 1 for c in [outboundConnections for outboundConnections in self.outboundConnections.values()] + 1 for c in [outboundConnections for outboundConnections in self.outboundConnections.values()] if (c.connected and c.fullyEstablished)) pending = len(self.outboundConnections) - established if established < int(BMConfigParser().safeGet( @@ -430,14 +430,13 @@ class BMConnectionPool(object): # list(self.udpSockets.values()) # ): for i in ( - - # [inboundConnections for inboundConnections in self.inboundConnections.values()] + - # [outboundConnections for outboundConnections in self.outboundConnections.values()] + - # [listeningSockets for listeningSockets in self.listeningSockets.values()] + - # [udpSockets for udpSockets in self.udpSockets.values()] - - self.connections() - + [listeningSockets for listeningSockets in self.listeningSockets.values()] + [udpSockets for udpSockets in self.udpSockets.values()] + # [inboundConnections for inboundConnections in self.inboundConnections.values()] + + # [outboundConnections for outboundConnections in self.outboundConnections.values()] + + # [listeningSockets for listeningSockets in self.listeningSockets.values()] + + # [udpSockets for udpSockets in self.udpSockets.values()] + self.connections() + + [listeningSockets for listeningSockets in self.listeningSockets.values()] + + [udpSockets for udpSockets in self.udpSockets.values()] ): if not (i.accepting or i.connecting or i.connected): reaper.append(i) diff --git a/src/network/dandelion.py b/src/network/dandelion.py index 7e059f7f..ec9384e5 100644 --- a/src/network/dandelion.py +++ b/src/network/dandelion.py @@ -28,7 +28,7 @@ logger = logging.getLogger('default') @Singleton -class Dandelion(): # pylint: disable=old-style-class +class Dandelion(object): """Dandelion class for tracking stem/fluff stages.""" def __init__(self): # currently assignable child stems @@ -104,12 +104,12 @@ class Dandelion(): # pylint: disable=old-style-class self.stem.append(connection) for k in (k for k, v in iter(self.nodeMap.items()) if v is None): self.nodeMap[k] = connection - #The Purpose of adding this condition that if self - #hashMap is has any value + # The Purpose of adding this condition that if self + # hashMap is has any value # if not [hasmap for hasmap in self.hashMap.items()] ==[]: try: for k, v in { - k: v for k, v in iter([hasmap for hasmap in self.hashMap.items()]) + k: v for k, v in iter([hasmap for hasmap in self.hashMap.items()]) if v.child is None }.items(): self.hashMap[k] = Stem( @@ -142,7 +142,7 @@ class Dandelion(): # pylint: disable=old-style-class ): self.nodeMap[k] = None for k, v in { - k: v for k, v in iter(iter([hasmap for hasmap in self.hashMap.items()])) + k: v for k, v in iter(iter([hasmap for hasmap in self.hashMap.items()])) if v.child == connection }.items(): self.hashMap[k] = Stem( diff --git a/src/network/downloadthread.py b/src/network/downloadthread.py index c4519bb4..6e1f9ca8 100644 --- a/src/network/downloadthread.py +++ b/src/network/downloadthread.py @@ -44,7 +44,8 @@ class DownloadThread(StoppableThread): # Choose downloading peers randomly # connections = [ # x for x in - # list(BMConnectionPool().inboundConnections.values()) + list(BMConnectionPool().outboundConnections.values()) + # list(BMConnectionPool().inboundConnections.values()) + + # list(BMConnectionPool().outboundConnections.values()) # if x.fullyEstablished] connections = BMConnectionPool().establishedConnections() diff --git a/src/network/http.py b/src/network/http.py index fdfe8370..4a21b63e 100644 --- a/src/network/http.py +++ b/src/network/http.py @@ -1,3 +1,4 @@ +# pylint: disable=redefined-outer-name, too-many-ancestors, missing-docstring import socket from advanceddispatcher import AdvancedDispatcher @@ -12,7 +13,7 @@ class HttpError(ProxyError): class HttpConnection(AdvancedDispatcher): - def __init__(self, host, path="/"): # pylint: disable=redefined-outer-name + def __init__(self, host, path="/"): AdvancedDispatcher.__init__(self) self.path = path self.destination = (host, 80) @@ -38,7 +39,7 @@ class HttpConnection(AdvancedDispatcher): class Socks5HttpConnection(Socks5Connection, HttpConnection): - def __init__(self, host, path="/"): # pylint: disable=super-init-not-called, redefined-outer-name + def __init__(self, host, path="/"): # pylint: disable=super-init-not-called self.path = path Socks5Connection.__init__(self, address=(host, 80)) @@ -48,7 +49,7 @@ class Socks5HttpConnection(Socks5Connection, HttpConnection): class Socks4aHttpConnection(Socks4aConnection, HttpConnection): - def __init__(self, host, path="/"): # pylint: disable=super-init-not-called, redefined-outer-name + def __init__(self, host, path="/"): # pylint: disable=super-init-not-called Socks4aConnection.__init__(self, address=(host, 80)) self.path = path diff --git a/src/network/http_old.py b/src/network/http_old.py index 64d09983..c46a5d09 100644 --- a/src/network/http_old.py +++ b/src/network/http_old.py @@ -1,3 +1,6 @@ +""" +src/network/http_old.py +""" import asyncore import socket import time diff --git a/src/network/httpd.py b/src/network/httpd.py index b69ffa99..1679f864 100644 --- a/src/network/httpd.py +++ b/src/network/httpd.py @@ -5,7 +5,7 @@ src/network/httpd.py import asyncore import socket -from tls import TLSHandshake +from .tls import TLSHandshake class HTTPRequestHandler(asyncore.dispatcher): @@ -129,7 +129,7 @@ class HTTPServer(asyncore.dispatcher): def handle_accept(self): pair = self.accept() if pair is not None: - sock, addr = pair + sock, _ = pair # print 'Incoming connection from %s' % repr(addr) self.connections += 1 # if self.connections % 1000 == 0: @@ -148,7 +148,7 @@ class HTTPSServer(HTTPServer): def handle_accept(self): pair = self.accept() if pair is not None: - sock, addr = pair + sock, _ = pair # print 'Incoming connection from %s' % repr(addr) self.connections += 1 # if self.connections % 1000 == 0: diff --git a/src/network/https.py b/src/network/https.py index a7b8b57c..fc944d97 100644 --- a/src/network/https.py +++ b/src/network/https.py @@ -1,8 +1,8 @@ +# pylint: disable=missing-docstring import asyncore -from http import HTTPClient -from tls import TLSHandshake - +from .http import HTTPClient +from .tls import TLSHandshake """ self.sslSock = ssl.wrap_socket( self.sock, @@ -17,6 +17,7 @@ self.sslSock = ssl.wrap_socket( class HTTPSClient(HTTPClient, TLSHandshake): def __init__(self, host, path): + # pylint: disable=non-parent-init-called if not hasattr(self, '_map'): asyncore.dispatcher.__init__(self) self.tlsDone = False diff --git a/src/network/networkthread.py b/src/network/networkthread.py index 34c94bf2..9b4ba1e5 100644 --- a/src/network/networkthread.py +++ b/src/network/networkthread.py @@ -19,12 +19,12 @@ class BMNetworkThread(StoppableThread): def stopThread(self): super(BMNetworkThread, self).stopThread() - for i in [listeningSockets for listeningSockets in BMConnectionPool().listeningSockets.values()]: + for i in [listeningSockets for listeningSockets in BMConnectionPool().listeningSockets.values()]: try: i.close() except: pass - for i in [ outboundConnections for outboundConnections in BMConnectionPool().outboundConnections.values()]: + for i in [outboundConnections for outboundConnections in BMConnectionPool().outboundConnections.values()]: try: i.close() except: diff --git a/src/network/randomtrackingdict.py b/src/network/randomtrackingdict.py index 16eb63e1..c5c460b4 100644 --- a/src/network/randomtrackingdict.py +++ b/src/network/randomtrackingdict.py @@ -140,20 +140,20 @@ if __name__ == '__main__': k = RandomTrackingDict() d = {} - print ("populating random tracking dict") + print("populating random tracking dict") a.append(time()) for i in range(50000): k[randString()] = True a.append(time()) - print ("done") + print("done") while k: retval = k.randomKeys(1000) if not retval: - print ("error getting random keys") + print("error getting random keys") try: k.randomKeys(100) - print( "bad") + print("bad") except KeyError: pass for i in retval: diff --git a/src/network/tcp.py b/src/network/tcp.py index c7f5aa01..7dff0122 100644 --- a/src/network/tcp.py +++ b/src/network/tcp.py @@ -77,7 +77,7 @@ class TCPConnection(BMProto, TLSDispatcher): self.connect(self.destination) logger.debug( 'Connecting to {}:{}'.format( - self.destination.host, self.destination.port)) + self.destination.host, self.destination.port)) try: self.local = ( protocol.checkIPAddress( @@ -90,7 +90,7 @@ class TCPConnection(BMProto, TLSDispatcher): ObjectTracker.__init__(self) # pylint: disable=non-parent-init-called self.bm_proto_reset() # print('--------------tcp------------------') - from network import stats + # from network import stats self.set_state("bm_header", expectBytes=protocol.Header.size) def antiIntersectionDelay(self, initial=False): @@ -370,7 +370,7 @@ class TCPServer(AdvancedDispatcher): """TCP connection server for Bitmessage protocol""" def __init__(self, host='127.0.0.1', port=8444): - if '_map' not in dir(self): + if '_map' not in dir(self): AdvancedDispatcher.__init__(self) self.create_socket(socket.AF_INET, socket.SOCK_STREAM) self.set_reuse_addr() diff --git a/src/network/tls.py b/src/network/tls.py index 479fe4de..08969227 100644 --- a/src/network/tls.py +++ b/src/network/tls.py @@ -1,7 +1,6 @@ """ SSL/TLS negotiation. """ - import logging import os import socket @@ -23,7 +22,7 @@ if sys.version_info >= (2, 7, 13): # in the future change to # ssl.PROTOCOL_TLS1.2 # Right now I am using the python3.5.2 and I faced the ssl for protocol due to this I - # have used try and catch + # have used try and catch try: sslProtocolVersion = ssl.PROTOCOL_TLS # pylint: disable=no-member except AttributeError: diff --git a/src/openclpow.py b/src/openclpow.py index 717acc93..d90e55d1 100644 --- a/src/openclpow.py +++ b/src/openclpow.py @@ -119,4 +119,4 @@ if __name__ == "__main__": nonce = do_opencl_pow(initialHash.encode("hex"), target_) 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_)) diff --git a/src/proofofwork.py b/src/proofofwork.py index 6fefb196..e79efc3b 100644 --- a/src/proofofwork.py +++ b/src/proofofwork.py @@ -294,7 +294,7 @@ def init(): global bitmsglib, bmpow openclpow.initCL() - if "win32" == sys.platform: + if sys.platform == "win32": if ctypes.sizeof(ctypes.c_voidp) == 4: bitmsglib = 'bitmsghash32.dll' else: @@ -323,7 +323,7 @@ def init(): elif platform == "android": try: bso = ctypes.CDLL('libbitmsghash.so') - except Exception as e: + except Exception: bso = None else: diff --git a/src/protocol.py b/src/protocol.py index 246ee8ad..fd3ce26b 100644 --- a/src/protocol.py +++ b/src/protocol.py @@ -185,7 +185,8 @@ def checkIPv4Address(host, hostStandardFormat, private=False): logger.debug( 'Ignoring IP address in private range: %s', hostStandardFormat) return hostStandardFormat if private else False - if host[0:2] >= '\xAC\x10'.encode('raw_unicode_escape') and host[0:2] < '\xAC\x20'.encode('raw_unicode_escape'): # 172.16/12 + # 172.16/12 + if host[0:2] >= '\xAC\x10'.encode('raw_unicode_escape') and host[0:2] < '\xAC\x20'.encode('raw_unicode_escape'): if not private: logger.debug( 'Ignoring IP address in private range: %s', hostStandardFormat) @@ -198,15 +199,15 @@ def checkIPv6Address(host, hostStandardFormat, private=False): if host == ('\x00'.encode() * 15) + '\x01'.encode(): if not private: - logger.debug('Ignoring loopback address: {}'.format( hostStandardFormat)) + logger.debug('Ignoring loopback address: {}'.format(hostStandardFormat)) return False if host[0] == '\xFE' and (ord(host[1]) & 0xc0) == 0x80: if not private: - logger.debug('Ignoring local address: {}'.format( hostStandardFormat)) + logger.debug('Ignoring local address: {}'.format(hostStandardFormat)) return hostStandardFormat if private else False if (ord(host[0:1]) & 0xfe) == 0xfc: if not private: - logger.debug('Ignoring unique local address: {}'.format( hostStandardFormat)) + logger.debug('Ignoring unique local address: {}'.format(hostStandardFormat)) return hostStandardFormat if private else False return False if private else hostStandardFormat @@ -277,14 +278,13 @@ def isProofOfWorkSufficient( def CreatePacket(command, payload=''): """Construct and return a number of bytes from a payload""" - payload = payload if type(payload) == bytes else payload.encode() - + payload = payload if type(payload) in [bytes,bytearray] else payload.encode() payload_length = len(payload) checksum = hashlib.sha512(payload).digest()[0:4] byte = bytearray(Header.size + payload_length) Header.pack_into(byte, 0, 0xE9BEB4D9, command.encode(), payload_length, checksum) byte[Header.size:] = payload - return byte + return bytes(byte) def assembleVersionMessage(remoteHost, remotePort, participatingStreams, server=False, nodeid=None): @@ -324,10 +324,8 @@ def assembleVersionMessage(remoteHost, remotePort, participatingStreams, server= (NODE_DANDELION if state.dandelion else 0) ) # = 127.0.0.1. This will be ignored by the remote host. The actual remote connected IP will be used. - #python3 need to check - payload += '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF'.encode() + pack('>L', 2130706433) - + payload += '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF'.encode('raw_unicode_escape') + pack('>L', 2130706433) # we have a separate extPort and incoming over clearnet # or outgoing through clearnet extport = BMConfigParser().safeGetInt('bitmessagesettings', 'extport') @@ -338,11 +336,10 @@ def assembleVersionMessage(remoteHost, remotePort, participatingStreams, server= ): payload += pack('>H', extport) elif checkSocksIP(remoteHost) and server: # incoming connection over Tor - payload += pack('>H', int(BMConfigParser().safeGet('bitmessagesettings', 'onionport'))) + payload += pack('>H', int(BMConfigParser().safeGet('bitmessagesettings', 'onionport'))) else: # no extport and not incoming over Tor payload += pack('>H', int(BMConfigParser().safeGet('bitmessagesettings', 'port'))) - if nodeid is not None: payload += nodeid[0:8] else: @@ -374,7 +371,7 @@ def assembleErrorMessage(fatal=0, banTime=0, inventoryVector='', errorText=''): payload += encodeVarint(len(inventoryVector)) payload += inventoryVector.encode() if type(payload) == bytes else inventoryVector payload += encodeVarint(len(errorText)) - payload += errorText.encode() if type(payload)== bytes else errorText + payload += errorText.encode() if type(payload) == bytes else errorText return CreatePacket('error', payload) diff --git a/src/queues.py b/src/queues.py index bce5eb32..6a76adb6 100644 --- a/src/queues.py +++ b/src/queues.py @@ -1,6 +1,5 @@ - -import queue as Queue """Most of the queues used by bitmessage threads are defined here.""" +import queue as Queue import threading import time diff --git a/src/semaphores.py b/src/semaphores.py index 04120fe7..960d86a9 100644 --- a/src/semaphores.py +++ b/src/semaphores.py @@ -1,3 +1,3 @@ from threading import Semaphore -kivyuisignaler = Semaphore(0) \ No newline at end of file +kivyuisignaler = Semaphore(0) diff --git a/src/shared.py b/src/shared.py index d02578ce..98f47d19 100644 --- a/src/shared.py +++ b/src/shared.py @@ -101,6 +101,7 @@ def isAddressInMyAddressBookSubscriptionsListOrWhitelist(address): return True return False + def decodeWalletImportFormat(WIFstring): # pylint: disable=inconsistent-return-statements """ @@ -116,7 +117,7 @@ def decodeWalletImportFormat(WIFstring): ' 6 characters of the PRIVATE key: {}'.format(str(WIFstring)[:6]) ) - os._exit(0) + os._exit(0) # pylint: disable=protected-access if privkey[0:1] == '\x80'.encode()[1:]: # checksum passed return privkey[1:] diff --git a/src/singleinstance.py b/src/singleinstance.py index 169613a3..2936e49b 100644 --- a/src/singleinstance.py +++ b/src/singleinstance.py @@ -75,7 +75,7 @@ class singleinstance(object): fcntl.lockf(self.fp, fcntl.LOCK_EX | fcntl.LOCK_NB) self.lockPid = os.getpid() except IOError: - print ('Another instance of this application is already running') + print('Another instance of this application is already running') sys.exit(-1) else: pidLine = "%i\n" % self.lockPid @@ -95,10 +95,10 @@ class singleinstance(object): os.close(self.fd) else: fcntl.lockf(self.fp, fcntl.LOCK_UN) - except Exception as e: + except Exception: pass return - print ("Cleaning up lockfile") + print("Cleaning up lockfile") try: if sys.platform == 'win32': if hasattr(self, 'fd'): diff --git a/src/state.py b/src/state.py index 038e0e0a..5207099f 100644 --- a/src/state.py +++ b/src/state.py @@ -1,43 +1,30 @@ """ -Global runtime variables. +src/state.py +================================= """ import collections neededPubkeys = {} streamsInWhichIAmParticipating = [] - +# For UPnP extPort = None -"""For UPnP""" - +# for Tor hidden service socksIP = None -"""for Tor hidden service""" - -appdata = '' -"""holds the location of the application data storage directory""" - +# Network protocols availability, initialised below +networkProtocolAvailability = None +appdata = '' # holds the location of the application data storage directory +# Set to 1 by the doCleanShutdown function. +# Used to tell the proof of work worker threads to exit. shutdown = 0 -""" -Set to 1 by the `.shutdown.doCleanShutdown` function. -Used to tell the threads to exit. -""" - # Component control flags - set on startup, do not change during runtime # The defaults are for standalone GUI (default operating mode) -enableNetwork = True -"""enable network threads""" -enableObjProc = True -"""enable object processing thread""" -enableAPI = True -"""enable API (if configured)""" -enableGUI = True -"""enable GUI (QT or ncurses)""" -enableSTDIO = False -"""enable STDIO threads""" +enableNetwork = True # enable network threads +enableObjProc = True # enable object processing threads +enableAPI = True # enable API (if configured) +enableGUI = True # enable GUI (QT or ncurses) +enableSTDIO = False # enable STDIO threads curses = False - -sqlReady = False -"""set to true by `.threads.sqlThread` when ready for processing""" - +sqlReady = False # set to true by sqlTread when ready for processing maximumNumberOfHalfOpenConnections = 0 invThread = None addrThread = None @@ -68,8 +55,6 @@ def resetNetworkProtocolAvailability(): resetNetworkProtocolAvailability() -discoveredPeers = {} - dandelion = 0 testmode = False @@ -124,4 +109,4 @@ availabe_credit = 0 in_sent_method = False -in_search_mode = False \ No newline at end of file +in_search_mode = False diff --git a/src/storage/sqlite.py b/src/storage/sqlite.py index 3eec3be6..c272f4ed 100644 --- a/src/storage/sqlite.py +++ b/src/storage/sqlite.py @@ -39,15 +39,20 @@ class SqliteInventory(InventoryStorage): # pylint: disable=too-many-ancestors return True def __getitem__(self, hash_): - print('----------__getitem__------------------') + if hash_ == 0: + hash_ = bytes() with self.lock: - if hash_ in self._inventory: - return self._inventory[hash_] - rows = sqlQuery( - 'SELECT objecttype, streamnumber, payload, expirestime, tag FROM inventory WHERE hash=?', - sqlite3.Binary(hash_)) - if not rows: - raise KeyError(hash_) + try: + if hash_ in self._inventory: + return self._inventory[hash_] + rows = sqlQuery( + 'SELECT objecttype, streamnumber, payload, expirestime, tag FROM inventory WHERE hash=?', + sqlite3.Binary(hash_)) + if not rows: + pass + # raise KeyError(hash_) + except: + pass return InventoryItem(*rows[0]) def __setitem__(self, hash_, value): diff --git a/src/tr.py b/src/tr.py index ce8edc8e..f3498037 100644 --- a/src/tr.py +++ b/src/tr.py @@ -6,17 +6,17 @@ import os import state -class translateClass: +class translateClass(object): """ This is used so that the translateText function can be used when we are in daemon mode and not using any QT functions. """ - # pylint: disable=old-style-class,too-few-public-methods + # pylint: disable=too-few-public-methods def __init__(self, context, text): self.context = context self.text = text - def arg(self, argument): # pylint: disable=unused-argument + def arg(self, _): """Replace argument placeholders""" if '%' in self.text: return translateClass(self.context, self.text.replace('%', '', 1)) @@ -25,7 +25,7 @@ class translateClass: return self.text -def _translate(context, text, disambiguation=None, encoding=None, n=None): # pylint: disable=unused-argument +def _translate(context, text, disambiguation=None, encoding=None, n=None): # pylint: disable=unused-argument return translateText(context, text, n) @@ -39,12 +39,12 @@ def translateText(context, text, n=None): try: from PyQt4 import QtCore, QtGui except Exception as err: - print ('PyBitmessage requires PyQt unless you want to run it as a daemon and interact with it using the API\ + print('PyBitmessage requires PyQt unless you want to run it as a daemon and interact with it using the API\ .You can download PyQt from http://www.riverbankcomputing.com/software/pyqt/download\ or by searching Google for \'PyQt Download\'.\ If you want to run in daemon mode, see https://bitmessage.org/wiki/Daemon') - print ('Error message:', err) - os._exit(0) # pylint: disable=protected-access + print('Error message:', err) + os._exit(0) # pylint: disable=protected-access if n is None: return QtGui.QApplication.translate(context, text) diff --git a/src/upnp.py b/src/upnp.py index 9ef4c4e8..93753de3 100644 --- a/src/upnp.py +++ b/src/upnp.py @@ -1,8 +1,8 @@ -# pylint: disable=too-many-statements,too-many-branches,protected-access,no-self-use -""" +""" Complete UPnP port forwarding implementation in separate thread. Reference: http://mattscodecave.com/posts/using-python-and-upnp-to-forward-a-port """ +# pylint: disable=too-many-statements,too-many-branches,protected-access,no-self-use import httplib import socket @@ -19,8 +19,8 @@ import tr from bmconfigparser import BMConfigParser from debug import logger from network.connectionpool import BMConnectionPool -from network.threads import StoppableThread from network.node import Peer +from network.threads import StoppableThread def createRequestXML(service, action, arguments=None): @@ -83,6 +83,7 @@ class UPnPError(Exception): class Router: # pylint: disable=old-style-class """Encapulate routing""" + name = "" path = "" address = None @@ -152,7 +153,6 @@ class Router: # pylint: disable=old-style-class def DeletePortMapping(self, externalPort, protocol): """Delete UPnP port mapping""" - resp = self.soapRequest(self.upnp_schema + ':1', 'DeletePortMapping', [ ('NewRemoteHost', ''), ('NewExternalPort', str(externalPort)), @@ -163,16 +163,12 @@ class Router: # pylint: disable=old-style-class def GetExternalIPAddress(self): """Get the external address""" - - resp = self.soapRequest( - self.upnp_schema + ':1', 'GetExternalIPAddress') + resp = self.soapRequest(self.upnp_schema + ':1', 'GetExternalIPAddress') dom = parseString(resp.read()) - return dom.getElementsByTagName( - 'NewExternalIPAddress')[0].childNodes[0].data + return dom.getElementsByTagName('NewExternalIPAddress')[0].childNodes[0].data def soapRequest(self, service, action, arguments=None): """Make a request to a router""" - conn = httplib.HTTPConnection(self.routerPath.hostname, self.routerPath.port) conn.request( 'POST', @@ -223,7 +219,6 @@ class uPnPThread(StoppableThread): def run(self): """Start the thread to manage UPnP activity""" - logger.debug("Starting UPnP thread") logger.debug("Local IP: %s", self.localIP) lastSent = 0 @@ -261,16 +256,12 @@ class uPnPThread(StoppableThread): self.routers.append(newRouter) self.createPortMapping(newRouter) try: - self_peer = Peer( - newRouter.GetExternalIPAddress(), - self.extPort - ) + self_peer = Peer(newRouter.GetExternalIPAddress(), self.extPort) except: logger.debug('Failed to get external IP') else: with knownnodes.knownNodesLock: - knownnodes.addKnownNode( - 1, self_peer, is_self=True) + knownnodes.addKnownNode(1, self_peer, is_self=True) queues.UISignalQueue.put(('updateStatusBar', tr._translate( "MainWindow", 'UPnP port mapping established on port %1' ).arg(str(self.extPort)))) @@ -296,12 +287,12 @@ class uPnPThread(StoppableThread): deleted = True self.deletePortMapping(router) if deleted: - queues.UISignalQueue.put(('updateStatusBar', tr._translate("MainWindow", 'UPnP port mapping removed'))) + queues.UISignalQueue.put( + ('updateStatusBar', tr._translate("MainWindow", 'UPnP port mapping removed'))) logger.debug("UPnP thread done") def getLocalIP(self): """Get the local IP of the node""" - s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) s.connect((uPnPThread.GOOGLE_DNS, 1)) @@ -309,7 +300,6 @@ class uPnPThread(StoppableThread): def sendSearchRouter(self): """Querying for UPnP services""" - ssdpRequest = "M-SEARCH * HTTP/1.1\r\n" + \ "HOST: %s:%d\r\n" % (uPnPThread.SSDP_ADDR, uPnPThread.SSDP_PORT) + \ "MAN: \"ssdp:discover\"\r\n" + \ @@ -324,7 +314,6 @@ class uPnPThread(StoppableThread): def createPortMapping(self, router): """Add a port mapping""" - for i in range(50): try: localIP = self.localIP @@ -336,10 +325,7 @@ class uPnPThread(StoppableThread): extPort = randint(32767, 65535) logger.debug( "Attempt %i, requesting UPnP mapping for %s:%i on external port %i", - i, - localIP, - self.localPort, - extPort) + i, localIP, self.localPort, extPort) router.AddPortMapping(extPort, self.localPort, localIP, 'TCP', 'BitMessage') self.extPort = extPort BMConfigParser().set('bitmessagesettings', 'extport', str(extPort))