def handle_write(self): try: retval = self.socket.sendto(self.write_buf, ('<broadcast>', UDPSocket.port)) except socket.error as e: logger.error("socket error on sendato: %s", str(e)) retval = 0 self.slice_write_buf(retval)
def soapRequest(self, service, action, arguments=None): from xml.dom.minidom import parseString from debug import logger conn = httplib.HTTPConnection(self.routerPath.hostname, self.routerPath.port) conn.request( 'POST', self.path, createRequestXML(service, action, arguments), { 'SOAPAction': '"urn:schemas-upnp-org:service:%s#%s"' % (service, action), 'Content-Type': 'text/xml' }) resp = conn.getresponse() conn.close() if resp.status == 500: respData = resp.read() try: dom = parseString(respData) errinfo = dom.getElementsByTagName('errorDescription') if len(errinfo) > 0: logger.error("UPnP error: %s", respData) raise UPnPError(errinfo[0].childNodes[0].data) except: raise UPnPError("Unable to parse SOAP error: %s" % (respData)) return resp
def soapRequest(self, service, action, arguments=[]): from xml.dom.minidom import parseString from debug import logger conn = httplib.HTTPConnection(self.routerPath.hostname, self.routerPath.port) conn.request( 'POST', self.path, createRequestXML(service, action, arguments), { 'SOAPAction': '"urn:schemas-upnp-org:service:%s#%s"' % (service, action), 'Content-Type': 'text/xml' } ) resp = conn.getresponse() conn.close() if resp.status == 500: respData = resp.read() try: dom = parseString(respData) errinfo = dom.getElementsByTagName('errorDescription') if len(errinfo) > 0: logger.error("UPnP error: %s", respData) raise UPnPError(errinfo[0].childNodes[0].data) except: raise UPnPError("Unable to parse SOAP error: %s" %(respData)) return resp
def knownNodes(): try: # We shouldn't have to use the shared.knownNodesLock because this had # better be the only thread accessing knownNodes right now. pickleFile = open(shared.appdata + 'knownnodes.dat', 'rb') loadedKnownNodes = pickle.load(pickleFile) pickleFile.close() # The old format of storing knownNodes was as a 'host: (port, time)' # mapping. The new format is as 'Peer: time' pairs. If we loaded # data in the old format, transform it to the new style. for stream, nodes in loadedKnownNodes.items(): shared.knownNodes[stream] = {} for node_tuple in nodes.items(): try: host, (port, lastseen) = node_tuple peer = shared.Peer(host, port) except: peer, lastseen = node_tuple shared.knownNodes[stream][peer] = lastseen except: shared.knownNodes = defaultKnownNodes.createDefaultKnownNodes(shared.appdata) # your own onion address, if setup if shared.config.has_option('bitmessagesettings', 'onionhostname') and ".onion" in shared.config.get('bitmessagesettings', 'onionhostname'): shared.knownNodes[1][shared.Peer(shared.config.get('bitmessagesettings', 'onionhostname'), shared.config.getint('bitmessagesettings', 'onionport'))] = int(time.time()) if shared.config.getint('bitmessagesettings', 'settingsversion') > 10: logger.error('Bitmessage cannot read future versions of the keys file (keys.dat). Run the newer version of Bitmessage.') raise SystemExit
def initCL(): """Initlialise OpenCL engine""" # pylint: disable=global-statement global ctx, queue, program, hash_dt, libAvailable if libAvailable is False: return del enabledGpus[:] del vendors[:] del gpus[:] ctx = False try: hash_dt = numpy.dtype([('target', numpy.uint64), ('v', numpy.str_, 73)]) try: for platform in cl.get_platforms(): gpus.extend(platform.get_devices(device_type=cl.device_type.GPU)) if BMConfigParser().safeGet("bitmessagesettings", "opencl") == platform.vendor: enabledGpus.extend(platform.get_devices( device_type=cl.device_type.GPU)) if platform.vendor not in vendors: vendors.append(platform.vendor) except: pass if enabledGpus: ctx = cl.Context(devices=enabledGpus) queue = cl.CommandQueue(ctx) f = open(os.path.join(paths.codePath(), "bitmsghash", 'bitmsghash.cl'), 'r') fstr = ''.join(f.readlines()) program = cl.Program(ctx, fstr).build(options="") logger.info("Loaded OpenCL kernel") else: logger.info("No OpenCL GPUs found") del enabledGpus[:] except Exception: logger.error("OpenCL fail: ", exc_info=True) del enabledGpus[:]
def knownNodes(): try: # We shouldn't have to use the shared.knownNodesLock because this had # better be the only thread accessing knownNodes right now. pickleFile = open(shared.appdata + 'knownnodes.dat', 'rb') loadedKnownNodes = pickle.load(pickleFile) pickleFile.close() # The old format of storing knownNodes was as a 'host: (port, time)' # mapping. The new format is as 'Peer: time' pairs. If we loaded # data in the old format, transform it to the new style. for stream, nodes in loadedKnownNodes.items(): shared.knownNodes[stream] = {} for node_tuple in nodes.items(): try: host, (port, time) = node_tuple peer = shared.Peer(host, port) except: peer, time = node_tuple shared.knownNodes[stream][peer] = time except: shared.knownNodes = defaultKnownNodes.createDefaultKnownNodes(shared.appdata) if shared.config.getint('bitmessagesettings', 'settingsversion') > 10: logger.error('Bitmessage cannot read future versions ' + 'of the keys file (keys.dat). Run the newer ' + 'version of Bitmessage.') raise SystemExit
def initCL(): global ctx, queue, program, hash_dt, libAvailable if libAvailable is False: return del enabledGpus[:] del vendors[:] del gpus[:] ctx = False try: hash_dt = numpy.dtype([('target', numpy.uint64), ('v', numpy.str_, 73)]) try: for platform in cl.get_platforms(): gpus.extend(platform.get_devices(device_type=cl.device_type.GPU)) if BMConfigParser().safeGet("bitmessagesettings", "opencl") == platform.vendor: enabledGpus.extend(platform.get_devices(device_type=cl.device_type.GPU)) if platform.vendor not in vendors: vendors.append(platform.vendor) except: pass if (len(enabledGpus) > 0): ctx = cl.Context(devices=enabledGpus) queue = cl.CommandQueue(ctx) f = open(os.path.join(paths.codePath(), "bitmsghash", 'bitmsghash.cl'), 'r') fstr = ''.join(f.readlines()) program = cl.Program(ctx, fstr).build(options="") logger.info("Loaded OpenCL kernel") else: logger.info("No OpenCL GPUs found") del enabledGpus[:] except Exception as e: logger.error("OpenCL fail: ", exc_info=True) del enabledGpus[:]
def knownNodes(): try: with open(state.appdata + 'knownnodes.dat', 'rb') as pickleFile: with knownnodes.knownNodesLock: knownnodes.knownNodes = pickle.load(pickleFile) # the old format was {Peer:lastseen, ...} # the new format is {Peer:{"lastseen":i, "rating":f}} for stream in knownnodes.knownNodes.keys(): for node, params in knownnodes.knownNodes[stream].items(): if isinstance(params, (float, int)): addKnownNode(stream, node, params) except: knownnodes.knownNodes = defaultKnownNodes.createDefaultKnownNodes( state.appdata) # your own onion address, if setup if BMConfigParser().has_option( 'bitmessagesettings', 'onionhostname') and ".onion" in BMConfigParser().get( 'bitmessagesettings', 'onionhostname'): addKnownNode(1, state.Peer( BMConfigParser().get('bitmessagesettings', 'onionhostname'), BMConfigParser().getint('bitmessagesettings', 'onionport')), self=True) if BMConfigParser().getint('bitmessagesettings', 'settingsversion') > 10: logger.error( 'Bitmessage cannot read future versions of the keys file (keys.dat). Run the newer version of Bitmessage.' ) raise SystemExit
def __init__(self, ssdpResponse, address): self.address = address row = ssdpResponse.split('\r\n') header = {} for i in range(1, len(row)): part = row[i].split(': ') if len(part) == 2: header[part[0].lower()] = part[1] try: self.routerPath = urlparse(header['location']) if not self.routerPath or not hasattr(self.routerPath, "hostname"): logger.error("UPnP: no hostname: %s", header['location']) except KeyError: logger.error("UPnP: missing location header") # get the profile xml file and read it into a variable directory = urllib2.urlopen(header['location']).read() # create a DOM object that represents the `directory` document dom = parseString(directory) self.name = dom.getElementsByTagName( 'friendlyName')[0].childNodes[0].data # find all 'serviceType' elements service_types = dom.getElementsByTagName('serviceType') for service in service_types: if service.childNodes[0].data.find('WANIPConnection') > 0 or \ service.childNodes[0].data.find('WANPPPConnection') > 0: self.path = service.parentNode.getElementsByTagName( 'controlURL')[0].childNodes[0].data self.upnp_schema = service.childNodes[0].data.split(':')[-2]
def signal_handler(signum, frame): """Single handler for any signal sent to pybitmessage""" process = multiprocessing.current_process() thread = threading.current_thread() logger.error( 'Got signal %i in %s/%s', signum, process.name, thread.name ) if process.name == "RegExParser": # on Windows this isn't triggered, but it's fine, # it has its own process termination thing raise SystemExit if "PoolWorker" in process.name: raise SystemExit if thread.name not in ("PyBitmessage", "MainThread"): return logger.error("Got signal %i", signum) # there are possible non-UI variants to run bitmessage # which should shutdown especially test-mode if state.thisapp.daemon or not state.enableGUI: shutdown.doCleanShutdown() else: print('# Thread: %s(%d)' % (thread.name, thread.ident)) for filename, lineno, name, line in traceback.extract_stack(frame): print('File: "%s", line %d, in %s' % (filename, lineno, name)) if line: print(' %s' % line.strip()) print('Unfortunately you cannot use Ctrl+C when running the UI' ' because the UI captures the signal.')
def checkSensitiveFilePermissions(filename): if sys.platform == 'win32': # TODO: This might deserve extra checks by someone familiar with # Windows systems. return True elif sys.platform[:7] == 'freebsd': # FreeBSD file systems are the same as major Linux file systems present_permissions = os.stat(filename)[0] disallowed_permissions = stat.S_IRWXG | stat.S_IRWXO return present_permissions & disallowed_permissions == 0 else: try: # Skip known problems for non-Win32 filesystems # without POSIX permissions. fstype = subprocess.check_output('stat -f -c "%%T" %s' % (filename), shell=True, stderr=subprocess.STDOUT) if 'fuseblk' in fstype: logger.info( 'Skipping file permissions check for %s.' ' Filesystem fuseblk detected.', filename) return True except: # Swallow exception here, but we might run into trouble later! logger.error('Could not determine filesystem type. %s', filename) present_permissions = os.stat(filename)[0] disallowed_permissions = stat.S_IRWXG | stat.S_IRWXO return present_permissions & disallowed_permissions == 0
def _doGPUPoW(target, initialHash): logger.debug("GPU PoW start") nonce = openclpow.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) if trialValue > target: deviceNames = ", ".join(gpu.name for gpu in openclpow.gpus) UISignalQueue.put(( 'updateStatusBar', tr._translate( "MainWindow", 'Your GPU(s) did not calculate correctly, disabling OpenCL. Please report to the developers.' ))) logger.error( "Your GPUs (%s) did not calculate correctly, disabling OpenCL. Please report to the developers.", deviceNames) openclpow.ctx = False raise Exception("GPU did not calculate correctly.") if shutdown != 0: raise Exception("Interrupted") logger.debug("GPU PoW done") return [trialValue, nonce]
def run(self): while True: objectType, data = queues.objectProcessorQueue.get() self.checkackdata(data) try: if objectType == 0: # getpubkey self.processgetpubkey(data) elif objectType == 1: # pubkey self.processpubkey(data) elif objectType == 2: # msg self.processmsg(data) elif objectType == 3: # broadcast self.processbroadcast(data) # is more of a command, not an object type. Is used to get # this thread past the queue.get() so that it will check # the shutdown variable. elif objectType == 'checkShutdownVariable': pass else: if isinstance(objectType, int): logger.info( 'Don\'t know how to handle object type 0x%08X', objectType) else: logger.info('Don\'t know how to handle object type %s', objectType) except helper_msgcoding.DecompressionSizeException as e: logger.error( 'The object is too big after decompression (stopped' ' decompressing at %ib, your configured limit %ib).' ' Ignoring', e.size, BMConfigParser().safeGetInt("zlib", "maxsize")) except varintDecodeError as e: logger.debug( 'There was a problem with a varint while processing an' ' object. Some details: %s', e) except Exception: logger.critical( 'Critical error within objectProcessorThread: \n', exc_info=True) if state.shutdown: # Wait just a moment for most of the connections to close time.sleep(.5) numberOfObjectsThatWereInTheObjectProcessorQueue = 0 with SqlBulkExecute() as sql: while queues.objectProcessorQueue.curSize > 0: objectType, data = queues.objectProcessorQueue.get() sql.execute( 'INSERT INTO objectprocessorqueue VALUES (?,?)', objectType, data) numberOfObjectsThatWereInTheObjectProcessorQueue += 1 logger.debug( 'Saved %s objects from the objectProcessorQueue to' ' disk. objectProcessorThread exiting.', numberOfObjectsThatWereInTheObjectProcessorQueue) state.shutdown = 2 break
def recerror(self, data): """ The remote node has been polite enough to send you an error message. """ fatalStatus, readPosition = decodeVarint(data[:10]) banTime, banTimeLength = decodeVarint(data[readPosition:readPosition+10]) readPosition += banTimeLength inventoryVectorLength, inventoryVectorLengthLength = decodeVarint(data[readPosition:readPosition+10]) if inventoryVectorLength > 100: return readPosition += inventoryVectorLengthLength inventoryVector = data[readPosition:readPosition+inventoryVectorLength] readPosition += inventoryVectorLength errorTextLength, errorTextLengthLength = decodeVarint(data[readPosition:readPosition+10]) if errorTextLength > 1000: return readPosition += errorTextLengthLength errorText = data[readPosition:readPosition+errorTextLength] if fatalStatus == 0: fatalHumanFriendly = 'Warning' elif fatalStatus == 1: fatalHumanFriendly = 'Error' elif fatalStatus == 2: fatalHumanFriendly = 'Fatal' message = '%s message received from %s: %s.' % (fatalHumanFriendly, self.peer, errorText) if inventoryVector: message += " This concerns object %s" % inventoryVector.encode('hex') if banTime > 0: message += " Remote node says that the ban time is %s" % banTime logger.error(message)
def handle_write(self): try: retval = self.socket.sendto(self.write_buf, ('<broadcast>', UDPSocket.port)) except socket.error as e: logger.error("socket error on sendato: %s", str(e)) self.slice_write_buf(retval)
def run(self): while not self._stopped and state.shutdown == 0: try: dest = receiveDataQueue.get(block=True, timeout=1) except Queue.Empty: continue if self._stopped or state.shutdown: break # cycle as long as there is data # methods should return False if there isn't enough data, or the connection is to be aborted # state_* methods should return False if there isn't enough data, # or the connection is to be aborted try: BMConnectionPool().getConnectionByAddr(dest).process() # KeyError = connection object not found # AttributeError = state isn't implemented except (KeyError, AttributeError): pass except socket.error as err: if err.errno == errno.EBADF: BMConnectionPool().getConnectionByAddr(dest).set_state("close", 0) else: logger.error("Socket error: %s", str(err)) receiveDataQueue.task_done()
def run(self): while not self._stopped and state.shutdown == 0: try: dest = receiveDataQueue.get(block=True, timeout=1) except Queue.Empty: continue if self._stopped: break # cycle as long as there is data # methods should return False if there isn't enough data, or the connection is to be aborted # state_* methods should return False if there isn't enough data, # or the connection is to be aborted try: BMConnectionPool().getConnectionByAddr(dest).process() # KeyError = connection object not found # AttributeError = state isn't implemented except (KeyError, AttributeError): pass except socket.error as err: if err.errno == errno.EBADF: BMConnectionPool().getConnectionByAddr(dest).set_state("close", 0) else: logger.error("Socket error: %s", str(err)) receiveDataQueue.task_done()
def sslHandshake(self): self.sslSock = self.sock if ((self.services & protocol.NODE_SSL == protocol.NODE_SSL) and protocol.haveSSL(not self.initiatedConnection)): logger.debug("Initialising TLS") if sys.version_info >= (2,7,9): context = ssl.SSLContext(protocol.sslProtocolVersion) context.set_ciphers(protocol.sslProtocolCiphers) context.set_ecdh_curve("secp256k1") context.check_hostname = False context.verify_mode = ssl.CERT_NONE # also exclude TLSv1 and TLSv1.1 in the future context.options = ssl.OP_ALL | ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3 | ssl.OP_SINGLE_ECDH_USE | ssl.OP_CIPHER_SERVER_PREFERENCE self.sslSock = context.wrap_socket(self.sock, server_side = not self.initiatedConnection, do_handshake_on_connect=False) else: self.sslSock = ssl.wrap_socket(self.sock, keyfile = os.path.join(paths.codePath(), 'sslkeys', 'key.pem'), certfile = os.path.join(paths.codePath(), 'sslkeys', 'cert.pem'), server_side = not self.initiatedConnection, ssl_version=protocol.sslProtocolVersion, do_handshake_on_connect=False, ciphers=protocol.sslProtocolCiphers) self.sendDataThreadQueue.join() while True: try: self.sslSock.do_handshake() logger.debug("TLS handshake success") if sys.version_info >= (2, 7, 9): logger.debug("TLS protocol version: %s", self.sslSock.version()) break except ssl.SSLError as e: if sys.hexversion >= 0x02070900: if isinstance (e, ssl.SSLWantReadError): logger.debug("Waiting for SSL socket handhake read") select.select([self.sslSock], [], [], 10) continue elif isinstance (e, ssl.SSLWantWriteError): logger.debug("Waiting for SSL socket handhake write") select.select([], [self.sslSock], [], 10) continue else: if e.args[0] == ssl.SSL_ERROR_WANT_READ: logger.debug("Waiting for SSL socket handhake read") select.select([self.sslSock], [], [], 10) continue elif e.args[0] == ssl.SSL_ERROR_WANT_WRITE: logger.debug("Waiting for SSL socket handhake write") select.select([], [self.sslSock], [], 10) continue logger.error("SSL socket handhake failed: shutting down connection, %s", str(e)) self.sendDataThreadQueue.put((0, 'shutdown','tls handshake fail %s' % (str(e)))) return False except socket.error as err: logger.debug('SSL socket handshake failed, shutting down connection, %s', str(err)) self.sendDataThreadQueue.put((0, 'shutdown','tls handshake fail')) return False except Exception: logger.error("SSL socket handhake failed, shutting down connection", exc_info=True) self.sendDataThreadQueue.put((0, 'shutdown','tls handshake fail')) return False # SSL in the background should be blocking, otherwise the error handling is difficult self.sslSock.settimeout(None) return True # no SSL return True
def encode(self, data): super(Vote, self).encode() try: self.data["msgid"] = data["msgid"] self.data["vote"] = data["vote"] except KeyError as e: logger.error("Missing key %s", e.name) return self.data
def encode(self, data): super(Message, self).encode() try: self.data["subject"] = data["subject"] self.data["body"] = data["body"] except KeyError as e: logger.error("Missing key %s", e.name) return self.data
def init(): """Initialise PoW""" # pylint: disable=global-statement global bitmsglib, bmpow openclpow.initCL() if sys.platform == "win32": if ctypes.sizeof(ctypes.c_voidp) == 4: bitmsglib = 'bitmsghash32.dll' else: bitmsglib = 'bitmsghash64.dll' try: # MSVS bso = ctypes.WinDLL(os.path.join(paths.codePath(), "bitmsghash", bitmsglib)) logger.info("Loaded C PoW DLL (stdcall) %s", bitmsglib) bmpow = bso.BitmessagePOW bmpow.restype = ctypes.c_ulonglong _doCPoW(2**63, "") logger.info("Successfully tested C PoW DLL (stdcall) %s", bitmsglib) except: logger.error("C PoW test fail.", exc_info=True) try: # MinGW bso = ctypes.CDLL(os.path.join(paths.codePath(), "bitmsghash", bitmsglib)) logger.info("Loaded C PoW DLL (cdecl) %s", bitmsglib) bmpow = bso.BitmessagePOW bmpow.restype = ctypes.c_ulonglong _doCPoW(2**63, "") logger.info("Successfully tested C PoW DLL (cdecl) %s", bitmsglib) except: logger.error("C PoW test fail.", exc_info=True) bso = None else: try: bso = ctypes.CDLL(os.path.join(paths.codePath(), "bitmsghash", bitmsglib)) except OSError: import glob try: bso = ctypes.CDLL(glob.glob(os.path.join( paths.codePath(), "bitmsghash", "bitmsghash*.so" ))[0]) except (OSError, IndexError): bso = None except: bso = None else: logger.info("Loaded C PoW DLL %s", bitmsglib) if bso: try: bmpow = bso.BitmessagePOW bmpow.restype = ctypes.c_ulonglong except: bmpow = None else: bmpow = None if bmpow is None: buildCPoW()
def init(): global bitmsglib, bso, bmpow openclpow.initCL() if "win32" == sys.platform: if ctypes.sizeof(ctypes.c_voidp) == 4: bitmsglib = 'bitmsghash32.dll' else: bitmsglib = 'bitmsghash64.dll' try: # MSVS bso = ctypes.WinDLL(os.path.join(paths.codePath(), "bitmsghash", bitmsglib)) logger.info("Loaded C PoW DLL (stdcall) %s", bitmsglib) bmpow = bso.BitmessagePOW bmpow.restype = ctypes.c_ulonglong _doCPoW(2**63, "") logger.info("Successfully tested C PoW DLL (stdcall) %s", bitmsglib) except: logger.error("C PoW test fail.", exc_info=True) try: # MinGW bso = ctypes.CDLL(os.path.join(paths.codePath(), "bitmsghash", bitmsglib)) logger.info("Loaded C PoW DLL (cdecl) %s", bitmsglib) bmpow = bso.BitmessagePOW bmpow.restype = ctypes.c_ulonglong _doCPoW(2**63, "") logger.info("Successfully tested C PoW DLL (cdecl) %s", bitmsglib) except: logger.error("C PoW test fail.", exc_info=True) bso = None else: try: bso = ctypes.CDLL(os.path.join(paths.codePath(), "bitmsghash", bitmsglib)) except OSError: import glob try: bso = ctypes.CDLL(glob.glob(os.path.join( paths.codePath(), "bitmsghash", "bitmsghash*.so" ))[0]) except (OSError, IndexError): bso = None except: bso = None else: logger.info("Loaded C PoW DLL %s", bitmsglib) if bso: try: bmpow = bso.BitmessagePOW bmpow.restype = ctypes.c_ulonglong except: bmpow = None else: bmpow = None if bmpow is None: buildCPoW()
def encodeExtended(self, message): try: self.data = zlib.compress(msgpack.dumps({"": "message", "subject": message['subject'], "message": ['body']}), 9) except zlib.error: logger.error ("Error compressing message") raise except msgpack.exceptions.PackException: logger.error ("Error msgpacking message") raise self.length = len(self.data)
def encodeExtended(self, message): try: msgObj = messagetypes.message.Message() self.data = zlib.compress(msgpack.dumps(msgObj.encode(message)), 9) except zlib.error: logger.error("Error compressing message") raise except msgpack.exceptions.PackException: logger.error("Error msgpacking message") raise self.length = len(self.data)
def encodeExtended(self, message): try: msgObj = messagetypes.message.Message() self.data = zlib.compress(msgpack.dumps(msgObj.encode(message)), 9) except zlib.error: logger.error("Error compressing message") raise MsgEncodeException("Error compressing message") except msgpack.exceptions.PackException: logger.error("Error msgpacking message") raise MsgEncodeException("Error msgpacking message") self.length = len(self.data)
def state_bm_command(self): self.payload = self.read_buf[:self.payloadLength] if self.checksum != hashlib.sha512(self.payload).digest()[0:4]: logger.debug("Bad checksum, ignoring") self.invalid = True retval = True if not self.fullyEstablished and self.command not in ("error", "version", "verack"): logger.error( "Received command %s before connection was fully established, ignoring", self.command) self.invalid = True if not self.invalid: try: retval = getattr(self, "bm_command_" + str(self.command).lower())() except AttributeError: # unimplemented command logger.debug("unimplemented command %s", self.command) except BMProtoInsufficientDataError: logger.debug("packet length too short, skipping") except BMProtoExcessiveDataError: logger.debug("too much data, skipping") except BMObjectInsufficientPOWError: logger.debug("insufficient PoW, skipping") except BMObjectInvalidDataError: logger.debug("object invalid data, skipping") except BMObjectExpiredError: logger.debug("object expired, skipping") except BMObjectUnwantedStreamError: logger.debug("object not in wanted stream, skipping") except BMObjectInvalidError: logger.debug("object invalid, skipping") except BMObjectAlreadyHaveError: logger.debug("%s:%i already got object, skipping", self.destination.host, self.destination.port) except struct.error: logger.debug("decoding error, skipping") elif self.socket.type == socket.SOCK_DGRAM: # broken read, ignore pass else: #print "Skipping command %s due to invalid data" % (self.command) logger.debug("Closing due to invalid command %s", self.command) self.close_reason = "Invalid command %s" % (self.command) self.set_state("close") return False if retval: self.set_state("bm_header", length=self.payloadLength) self.bm_proto_reset() # else assume the command requires a different state to follow return True
def test(self): """ Test the connection settings. This routine tries to query a "getinfo" command, and builds either an error message or a success message with some info from it. """ try: if self.nmctype == "namecoind": try: vers = self.callRPC("getinfo", [])["version"] except RPCError: vers = self.callRPC("getnetworkinfo", [])["version"] v3 = vers % 100 vers = vers / 100 v2 = vers % 100 vers = vers / 100 v1 = vers if v3 == 0: versStr = "0.%d.%d" % (v1, v2) else: versStr = "0.%d.%d.%d" % (v1, v2, v3) message = ('success', tr._translate( "MainWindow", 'Success! Namecoind version %1 running.').arg( unicode(versStr))) elif self.nmctype == "nmcontrol": res = self.callRPC("data", ["status"]) prefix = "Plugin data running" if ("reply" in res) and res["reply"][:len(prefix)] == prefix: return ('success', tr._translate( "MainWindow", 'Success! NMControll is up and running.')) logger.error("Unexpected nmcontrol reply: %s", res) message = ('failed', tr._translate("MainWindow", 'Couldn\'t understand NMControl.')) else: print "Unsupported Namecoin type" sys.exit(1) return message except Exception: logger.info("Namecoin connection test failure") return ('failed', tr._translate("MainWindow", "The connection to namecoin failed."))
def run(self): from debug import logger logger.debug("Starting UPnP thread") logger.debug("Local IP: %s", self.localIP) lastSent = 0 while shared.shutdown == 0 and shared.safeConfigGetBoolean('bitmessagesettings', 'upnp'): if time.time() - lastSent > self.sendSleep and len(self.routers) == 0: try: self.sendSearchRouter() except: pass lastSent = time.time() try: while shared.shutdown == 0 and shared.safeConfigGetBoolean('bitmessagesettings', 'upnp'): resp,(ip,port) = self.sock.recvfrom(1000) if resp is None: continue newRouter = Router(resp, ip) for router in self.routers: if router.location == newRouter.location: break else: logger.debug("Found UPnP router at %s", ip) self.routers.append(newRouter) self.createPortMapping(newRouter) shared.UISignalQueue.put(('updateStatusBar', tr._translate("MainWindow",'UPnP port mapping established on port %1').arg(str(self.extPort)))) break except socket.timeout as e: pass except: logger.error("Failure running UPnP router search.", exc_info=True) for router in self.routers: if router.extPort is None: self.createPortMapping(router) try: self.sock.shutdown(socket.SHUT_RDWR) except: pass try: self.sock.close() except: pass deleted = False for router in self.routers: if router.extPort is not None: deleted = True self.deletePortMapping(router) shared.extPort = None if deleted: shared.UISignalQueue.put(('updateStatusBar', tr._translate("MainWindow",'UPnP port mapping removed'))) logger.debug("UPnP thread done")
def bm_command_inv(self): items = self.decode_payload_content("l32s") if len(items) >= BMProto.maxObjectCount: logger.error("Too many items in inv message!") raise BMProtoExcessiveDataError() else: pass for i in map(str, items): self.handleReceivedInventory(i) return True
def sendVersionMessage(self): datatosend = protocol.assembleVersionMessage( self.peer.host, self.peer.port, state.streamsInWhichIAmParticipating, not self.initiatedConnection) # the IP and port of the remote host, and my streamNumber. logger.debug('Sending version packet: ' + repr(datatosend)) try: self.sendBytes(datatosend) except Exception as err: # if not 'Bad file descriptor' in err: logger.error('sock.sendall error: %s\n' % err) self.versionSent = 1
def _doGPUPoW(target, initialHash): logger.debug("GPU PoW start") nonce = openclpow.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) if trialValue > target: deviceNames = ", ".join(gpu.name for gpu in openclpow.gpus) UISignalQueue.put(('updateStatusBar', tr.translateText("MainWindow",'Your GPU(s) did not calculate correctly, disabling OpenCL. Please report to the developers.'))) logger.error("Your GPUs (%s) did not calculate correctly, disabling OpenCL. Please report to the developers.", deviceNames) openclpow.ctx = False raise Exception("GPU did not calculate correctly.") logger.debug("GPU PoW done") return [trialValue, nonce]
def sendVersionMessage(self): datatosend = protocol.assembleVersionMessage( self.peer.host, self.peer.port, state.streamsInWhichIAmParticipating, not self.initiatedConnection ) # the IP and port of the remote host, and my streamNumber. logger.debug('Sending version packet: ' + repr(datatosend)) try: self.sendBytes(datatosend) except Exception as err: # if not 'Bad file descriptor' in err: logger.error('sock.sendall error: %s\n' % err)
def bm_command_inv(self): items = self.decode_payload_content("l32s") if len(items) >= BMProto.maxObjectCount: logger.error("Too many items in inv message!") raise BMProtoExcessiveDataError() else: pass for i in items: self.handleReceivedInventory(i) return True
def signal_handler(signal, frame): logger.error("Got signal %i in %s/%s", signal, current_process().name, current_thread().name) if current_process().name != "MainProcess": raise StopIteration("Interrupted") if current_thread().name != "MainThread": return logger.error("Got signal %i", signal) if shared.safeConfigGetBoolean('bitmessagesettings', 'daemon'): shared.doCleanShutdown() else: print 'Unfortunately you cannot use Ctrl+C when running the UI because the UI captures the signal.'
def signal_handler(signal, frame): logger.error("Got signal %i in %s/%s", signal, current_process().name, threading.current_thread().name) if "PoolWorker" in current_process().name: raise SystemExit if threading.current_thread().name not in ("PyBitmessage", "MainThread"): return logger.error("Got signal %i", signal) if shared.thisapp.daemon or not state.enableGUI: # FIXME redundant? shutdown.doCleanShutdown() else: allThreadTraceback(frame) print 'Unfortunately you cannot use Ctrl+C when running the UI because the UI captures the signal.'
def signal_handler(signal, frame): logger.error("Got signal %i in %s/%s", signal, current_process().name, current_thread().name) if current_process().name == "RegExParser": # on Windows this isn't triggered, but it's fine, it has its own process termination thing raise SystemExit if "PoolWorker" in current_process().name: raise SystemExit if current_thread().name != "MainThread": return logger.error("Got signal %i", signal) if BMConfigParser().safeGetBoolean('bitmessagesettings', 'daemon'): shutdown.doCleanShutdown() else: print 'Unfortunately you cannot use Ctrl+C when running the UI because the UI captures the signal.'
def __init__(self, ssdpResponse, address): import urllib2 from xml.dom.minidom import parseString from urlparse import urlparse import pprint from debug import logger self.address = address row = ssdpResponse.split('\r\n') header = {} for i in range(1, len(row)): part = row[i].split(': ') if len(part) == 2: header[part[0].lower()] = part[1] try: self.routerPath = urlparse(header['location']) if not self.routerPath or not hasattr(self.routerPath, "hostname"): logger.error ("UPnP: no hostname: %s", header['location']) except KeyError: logger.error ("UPnP: missing location header") # get the profile xml file and read it into a variable directory = urllib2.urlopen(header['location']).read() # create a DOM object that represents the `directory` document dom = parseString(directory) self.name = dom.getElementsByTagName('friendlyName')[0].childNodes[0].data # find all 'serviceType' elements service_types = dom.getElementsByTagName('serviceType') for service in service_types: if service.childNodes[0].data.find('WANIPConnection') > 0: self.path = service.parentNode.getElementsByTagName('controlURL')[0].childNodes[0].data # get local IP s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) try: logger.debug("Connecting to %s:%i", self.address, self.routerPath.port) s.connect ((self.address, self.routerPath.port)) except: pass self.localAddress = s.getsockname()[0] logger.debug("Local IP: %s", self.localAddress) try: s.shutdown(socket.SHUT_RDWR) s.close() except: pass
def signal_handler(signal, frame): logger.error("Got signal %i in %s/%s", signal, current_process().name, current_thread().name) if current_process().name == "RegExParser": # on Windows this isn't triggered, but it's fine, it has its own process termination thing raise SystemExit if "PoolWorker" in current_process().name: raise SystemExit if current_thread().name not in ("PyBitmessage", "MainThread"): return logger.error("Got signal %i", signal) if shared.thisapp.daemon: shutdown.doCleanShutdown() else: allThreadTraceback(frame) print 'Unfortunately you cannot use Ctrl+C when running the UI because the UI captures the signal.'
def encodeVarint(integer): if integer < 0: logger.error('varint cannot be < 0') raise SystemExit if integer < 253: return pack('>B', integer) if integer >= 253 and integer < 65536: return pack('>B', 253) + pack('>H', integer) if integer >= 65536 and integer < 4294967296: return pack('>B', 254) + pack('>I', integer) if integer >= 4294967296 and integer < 18446744073709551616: return pack('>B', 255) + pack('>Q', integer) if integer >= 18446744073709551616: logger.error('varint cannot be >= 18446744073709551616') raise SystemExit
def signal_handler(signal, frame): logger.error("Got signal %i in %s/%s", signal, current_process().name, current_thread().name) if current_process().name == "RegExParser": # on Windows this isn't triggered, but it's fine, it has its own process termination thing raise SystemExit if "PoolWorker" in current_process().name: raise SystemExit if current_thread().name != "PyBitmessage": return logger.error("Got signal %i", signal) if BMConfigParser().safeGetBoolean('bitmessagesettings', 'daemon'): shutdown.doCleanShutdown() else: allThreadTraceback(frame) print 'Unfortunately you cannot use Ctrl+C when running the UI because the UI captures the signal.'
def run(self): from debug import logger logger.debug("Starting UPnP thread") lastSent = 0 while shared.shutdown == 0 and shared.safeConfigGetBoolean('bitmessagesettings', 'upnp'): if time.time() - lastSent > self.sendSleep and len(self.routers) == 0: self.sendSearchRouter() lastSent = time.time() try: while shared.shutdown == 0 and shared.safeConfigGetBoolean('bitmessagesettings', 'upnp'): resp,(ip,port) = self.sock.recvfrom(1000) if resp is None: continue newRouter = Router(resp, ip) for router in self.routers: if router.location == newRouter.location: break else: logger.debug("Found UPnP router at %s", ip) self.routers.append(newRouter) self.createPortMapping(newRouter) shared.UISignalQueue.put(('updateStatusBar', tr.translateText("MainWindow",'UPnP port mapping established on port %1').arg(str(self.extPort)))) break except socket.timeout as e: pass except: logger.error("Failure running UPnP router search.", exc_info=True) for router in self.routers: if router.extPort is None: self.createPortMapping(router) try: self.sock.shutdown(socket.SHUT_RDWR) except: pass try: self.sock.close() except: pass deleted = False for router in self.routers: if router.extPort is not None: deleted = True self.deletePortMapping(router) shared.extPort = None if deleted: shared.UISignalQueue.put(('updateStatusBar', tr.translateText("MainWindow",'UPnP port mapping removed'))) logger.debug("UPnP thread done")
def process(self): while self.connected and not state.shutdown: try: with nonBlocking(self.processingLock): if not self.connected or state.shutdown: break if len(self.read_buf) < self.expectBytes: return False if not getattr(self, "state_" + str(self.state))(): break except AttributeError: logger.error("Unknown state %s", self.state) raise except BusyError: return False return False
def process(self): while self.connected and not state.shutdown: try: with nonBlocking(self.processingLock): if not self.connected or state.shutdown: break if len(self.read_buf) < self.expectBytes: return False if not getattr(self, "state_" + str(self.state))(): break except AttributeError: logger.error("Unknown state %s", self.state, exc_info=True) raise except BusyError: return False return False
def init(): global bitmsglib, bso, bmpow if "win32" == sys.platform: if ctypes.sizeof(ctypes.c_voidp) == 4: bitmsglib = 'bitmsghash32.dll' else: bitmsglib = 'bitmsghash64.dll' try: # MSVS bso = ctypes.WinDLL( os.path.join(paths.codePath(), "bitmsghash", bitmsglib)) logger.info("Loaded C PoW DLL (stdcall) %s", bitmsglib) bmpow = bso.BitmessagePOW bmpow.restype = ctypes.c_ulonglong _doCPoW(2**63, "") logger.info("Successfully tested C PoW DLL (stdcall) %s", bitmsglib) except: logger.error("C PoW test fail.", exc_info=True) try: # MinGW bso = ctypes.CDLL( os.path.join(paths.codePath(), "bitmsghash", bitmsglib)) logger.info("Loaded C PoW DLL (cdecl) %s", bitmsglib) bmpow = bso.BitmessagePOW bmpow.restype = ctypes.c_ulonglong _doCPoW(2**63, "") logger.info("Successfully tested C PoW DLL (cdecl) %s", bitmsglib) except: logger.error("C PoW test fail.", exc_info=True) bso = None else: try: bso = ctypes.CDLL( os.path.join(paths.codePath(), "bitmsghash", bitmsglib)) logger.info("Loaded C PoW DLL %s", bitmsglib) except: bso = None if bso: try: bmpow = bso.BitmessagePOW bmpow.restype = ctypes.c_ulonglong except: bmpow = None else: bmpow = None
def state_bm_command(self): self.payload = self.read_buf[:self.payloadLength] if self.checksum != hashlib.sha512(self.payload).digest()[0:4]: logger.debug("Bad checksum, ignoring") self.invalid = True retval = True if not self.fullyEstablished and self.command not in ("error", "version", "verack"): logger.error("Received command %s before connection was fully established, ignoring", self.command) self.invalid = True if not self.invalid: try: retval = getattr(self, "bm_command_" + str(self.command).lower())() except AttributeError: # unimplemented command logger.debug("unimplemented command %s", self.command) except BMProtoInsufficientDataError: logger.debug("packet length too short, skipping") except BMProtoExcessiveDataError: logger.debug("too much data, skipping") except BMObjectInsufficientPOWError: logger.debug("insufficient PoW, skipping") except BMObjectInvalidDataError: logger.debug("object invalid data, skipping") except BMObjectExpiredError: logger.debug("object expired, skipping") except BMObjectUnwantedStreamError: logger.debug("object not in wanted stream, skipping") except BMObjectInvalidError: logger.debug("object invalid, skipping") except BMObjectAlreadyHaveError: logger.debug("%s:%i already got object, skipping", self.destination.host, self.destination.port) except struct.error: logger.debug("decoding error, skipping") elif self.socket.type == socket.SOCK_DGRAM: # broken read, ignore pass else: #print "Skipping command %s due to invalid data" % (self.command) logger.debug("Closing due to invalid command %s", self.command) self.close_reason = "Invalid command %s" % (self.command) self.set_state("close") return False if retval: self.set_state("bm_header", length=self.payloadLength) self.bm_proto_reset() # else assume the command requires a different state to follow return True
def handle_read(self): try: (recdata, addr) = self.socket.recvfrom(AdvancedDispatcher._buf_len) except socket.error as e: logger.error("socket error: %s", str(e)) return self.destination = state.Peer(addr[0], addr[1]) encodedAddr = protocol.encodeHost(addr[0]) if protocol.checkIPAddress(encodedAddr, True): self.local = True else: self.local = False # overwrite the old buffer to avoid mixing data and so that self.local works correctly self.read_buf[0:] = recdata self.bm_proto_reset() receiveDataQueue.put(self.listening)
def process_message(self, peer, mailfrom, rcpttos, data): # print 'Receiving message from:', peer p = re.compile(".*<([^>]+)>") if not hasattr(self.channel, "auth") or not self.channel.auth: logger.error("Missing or invalid auth") return try: self.msg_headers = Parser().parsestr(data) except: logger.error("Invalid headers") return try: sender, domain = p.sub(r'\1', mailfrom).split("@") if domain != SMTPDOMAIN: raise Exception("Bad domain %s", domain) if sender not in BMConfigParser().addresses(): raise Exception("Nonexisting user %s", sender) except Exception as err: logger.debug("Bad envelope from %s: %s", mailfrom, repr(err)) msg_from = self.decode_header("from") try: msg_from = p.sub(r'\1', self.decode_header("from")[0]) sender, domain = msg_from.split("@") if domain != SMTPDOMAIN: raise Exception("Bad domain %s", domain) if sender not in BMConfigParser().addresses(): raise Exception("Nonexisting user %s", sender) except Exception as err: logger.error("Bad headers from %s: %s", msg_from, repr(err)) return try: msg_subject = self.decode_header('subject')[0] except: msg_subject = "Subject missing..." msg_tmp = email.message_from_string(data) body = u'' for part in msg_tmp.walk(): if part and part.get_content_type() == "text/plain": body += part.get_payload(decode=1).decode(part.get_content_charset('utf-8'), errors='replace') for to in rcpttos: try: rcpt, domain = p.sub(r'\1', to).split("@") if domain != SMTPDOMAIN: raise Exception("Bad domain %s", domain) logger.debug("Sending %s to %s about %s", sender, rcpt, msg_subject) self.send(sender, rcpt, msg_subject, body) logger.info("Relayed %s to %s", sender, rcpt) except Exception as err: logger.error( "Bad to %s: %s", to, repr(err)) continue return
def initCL(): global ctx, queue, program, gpus, hash_dt try: hash_dt = numpy.dtype([("target", numpy.uint64), ("v", numpy.str_, 73)]) for platform in cl.get_platforms(): gpus.extend(platform.get_devices(device_type=cl.device_type.GPU)) if len(gpus) > 0: ctx = cl.Context(devices=gpus) queue = cl.CommandQueue(ctx) f = open(os.path.join(codePath(), "bitmsghash", "bitmsghash.cl"), "r") fstr = "".join(f.readlines()) program = cl.Program(ctx, fstr).build(options="") logger.info("Loaded OpenCL kernel") else: logger.info("No OpenCL GPUs found") ctx = False except Exception as e: logger.error("OpenCL fail: ", exc_info=True) ctx = False
def knownNodes(): try: with open(state.appdata + 'knownnodes.dat', 'rb') as pickleFile: with knownnodes.knownNodesLock: knownnodes.knownNodes = pickle.load(pickleFile) # the old format was {Peer:lastseen, ...} # the new format is {Peer:{"lastseen":i, "rating":f}} for stream in knownnodes.knownNodes.keys(): for node, params in knownnodes.knownNodes[stream].items(): if isinstance(params, (float, int)): addKnownNode(stream, node, params) except: knownnodes.knownNodes = defaultKnownNodes.createDefaultKnownNodes(state.appdata) # your own onion address, if setup if BMConfigParser().has_option('bitmessagesettings', 'onionhostname') and ".onion" in BMConfigParser().get('bitmessagesettings', 'onionhostname'): addKnownNode(1, state.Peer(BMConfigParser().get('bitmessagesettings', 'onionhostname'), BMConfigParser().getint('bitmessagesettings', 'onionport')), self=True) if BMConfigParser().getint('bitmessagesettings', 'settingsversion') > 10: logger.error('Bitmessage cannot read future versions of the keys file (keys.dat). Run the newer version of Bitmessage.') raise SystemExit
def run(target, initialHash): if state.shutdown != 0: raise target = int(target) if openclpow.openclEnabled(): # trialvalue1, nonce1 = _doGPUPoW(target, initialHash) # trialvalue, nonce = _doFastPoW(target, initialHash) # print "GPU: %s, %s" % (trialvalue1, nonce1) # print "Fast: %s, %s" % (trialvalue, nonce) # return [trialvalue, nonce] try: return _doGPUPoW(target, initialHash) except StopIteration: raise except: pass # fallback if bmpow: try: return _doCPoW(target, initialHash) except StopIteration: raise except: pass # fallback if paths.frozen == "macosx_app" or not paths.frozen: # on my (Peter Surda) Windows 10, Windows Defender # does not like this and fights with PyBitmessage # over CPU, resulting in very slow PoW # added on 2015-11-29: multiprocesing.freeze_support() doesn't help try: return _doFastPoW(target, initialHash) except StopIteration: logger.error("Fast PoW got StopIteration") raise except: logger.error("Fast PoW got exception:", exc_info=True) pass #fallback try: return _doSafePoW(target, initialHash) except StopIteration: raise except: pass #fallback
def run(self): while True: objectType, data = queues.objectProcessorQueue.get() self.checkackdata(data) try: if objectType == 0: # getpubkey self.processgetpubkey(data) elif objectType == 1: #pubkey self.processpubkey(data) elif objectType == 2: #msg self.processmsg(data) elif objectType == 3: #broadcast self.processbroadcast(data) elif objectType == 'checkShutdownVariable': # is more of a command, not an object type. Is used to get this thread past the queue.get() so that it will check the shutdown variable. pass else: if isinstance(objectType, int): logger.info('Don\'t know how to handle object type 0x%08X', objectType) else: logger.info('Don\'t know how to handle object type %s', objectType) except helper_msgcoding.DecompressionSizeException as e: logger.error("The object is too big after decompression (stopped decompressing at %ib, your configured limit %ib). Ignoring", e.size, BMConfigParser().safeGetInt("zlib", "maxsize")) except varintDecodeError as e: logger.debug("There was a problem with a varint while processing an object. Some details: %s" % e) except Exception as e: logger.critical("Critical error within objectProcessorThread: \n%s" % traceback.format_exc()) if state.shutdown: time.sleep(.5) # Wait just a moment for most of the connections to close numberOfObjectsThatWereInTheObjectProcessorQueue = 0 with SqlBulkExecute() as sql: while queues.objectProcessorQueue.curSize > 0: objectType, data = queues.objectProcessorQueue.get() sql.execute('''INSERT INTO objectprocessorqueue VALUES (?,?)''', objectType,data) numberOfObjectsThatWereInTheObjectProcessorQueue += 1 logger.debug('Saved %s objects from the objectProcessorQueue to disk. objectProcessorThread exiting.' % str(numberOfObjectsThatWereInTheObjectProcessorQueue)) state.shutdown = 2 break
def bm_command_dinv(self): """ Dandelion stem announce """ items = self.decode_payload_content("l32s") if len(items) >= BMProto.maxObjectCount: logger.error("Too many items in dinv message!") raise BMProtoExcessiveDataError() else: pass # ignore command if dandelion turned off if BMConfigParser().safeGetBoolean("network", "dandelion") == 0: return True for i in map(str, items): self.handleReceivedInventory(i) Dandelion().addHash(i, self) return True
def __init__(self, ssdpResponse, address): import urllib2 from xml.dom.minidom import parseString from urlparse import urlparse from debug import logger self.address = address row = ssdpResponse.split('\r\n') header = {} for i in range(1, len(row)): part = row[i].split(': ') if len(part) == 2: header[part[0].lower()] = part[1] try: self.routerPath = urlparse(header['location']) if not self.routerPath or not hasattr(self.routerPath, "hostname"): logger.error ("UPnP: no hostname: %s", header['location']) except KeyError: logger.error ("UPnP: missing location header") # get the profile xml file and read it into a variable directory = urllib2.urlopen(header['location']).read() # create a DOM object that represents the `directory` document dom = parseString(directory) self.name = dom.getElementsByTagName('friendlyName')[0].childNodes[0].data # find all 'serviceType' elements service_types = dom.getElementsByTagName('serviceType') for service in service_types: if service.childNodes[0].data.find('WANIPConnection') > 0 or \ service.childNodes[0].data.find('WANPPPConnection') > 0: self.path = service.parentNode.getElementsByTagName('controlURL')[0].childNodes[0].data self.upnp_schema = service.childNodes[0].data.split(':')[-2]
def dns(): # DNS bootstrap. This could be programmed to use the SOCKS proxy to do the # DNS lookup some day but for now we will just rely on the entries in # defaultKnownNodes.py. Hopefully either they are up to date or the user # has run Bitmessage recently without SOCKS turned on and received good # bootstrap nodes using that method. # TODO: Clarify the integrity of DNS data? if shared.config.get('bitmessagesettings', 'socksproxytype') == 'none': try: for item in socket.getaddrinfo('bootstrap8080.bitmessage.org', 80): logger.info('Adding ' + item[4][0] + ' to knownNodes based on DNS bootstrap method') shared.knownNodes[1][shared.Peer(item[4][0], 8080)] = int(time.time()) except: logger.error('bootstrap8080.bitmessage.org DNS bootstrapping failed.') try: for item in socket.getaddrinfo('bootstrap8444.bitmessage.org', 80): logger.info('Adding ' + item[4][0] + ' to knownNodes based on DNS bootstrap method') shared.knownNodes[1][shared.Peer(item[4][0], 8444)] = int(time.time()) except: logger.error('bootstrap8444.bitmessage.org DNS bootstrapping failed.') elif shared.config.get('bitmessagesettings', 'socksproxytype') == 'SOCKS5': shared.knownNodes[1][shared.Peer('quzwelsuziwqgpt2.onion', 8444)] = int(time.time()) logger.debug("Adding quzwelsuziwqgpt2.onion:8444 to knownNodes.") for port in [8080, 8444]: logger.debug("Resolving %i through SOCKS...", port) address_family = socket.AF_INET sock = socks.socksocket(address_family, socket.SOCK_STREAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.settimeout(20) proxytype = socks.PROXY_TYPE_SOCKS5 sockshostname = shared.config.get('bitmessagesettings', 'sockshostname') socksport = shared.config.getint('bitmessagesettings', 'socksport') # Do domain name lookups through the proxy; # though this setting doesn't really matter # since we won't be doing any domain name lookups anyway. rdns = True if shared.config.getboolean('bitmessagesettings', 'socksauthentication'): socksusername = shared.config.get('bitmessagesettings', 'socksusername') sockspassword = shared.config.get('bitmessagesettings', 'sockspassword') sock.setproxy(proxytype, sockshostname, socksport, rdns, socksusername, sockspassword) else: sock.setproxy( proxytype, sockshostname, socksport, rdns) try: ip = sock.resolve("bootstrap" + str(port) + ".bitmessage.org") sock.shutdown(socket.SHUT_RDWR) sock.close() except: logger.error("SOCKS DNS resolving failed", exc_info=True) if ip is not None: logger.info('Adding ' + ip + ' to knownNodes based on SOCKS DNS bootstrap method') shared.knownNodes[1][shared.Peer(ip, port)] = time.time() else: logger.info('DNS bootstrap skipped because the proxy type does not support DNS resolution.')
def constructObject(data): try: classBase = eval(data[""] + "." + data[""].title()) except NameError: logger.error("Don't know how to handle message type: \"%s\"", data[""]) return None try: returnObj = classBase() returnObj.decode(data) except KeyError as e: logger.error("Missing mandatory key %s", e) return None except: logger.error("classBase fail", exc_info=True) return None else: return returnObj
def decodeExtended(self, data): try: tmp = msgpack.loads(zlib.decompress(data)) except zlib.error: logger.error ("Error decompressing message") raise except (msgpack.exceptions.UnpackException, msgpack.exceptions.ExtraData): logger.error ("Error msgunpacking message") raise try: if tmp[""] == "message": self.body = tmp["body"] self.subject = tmp["subject"] except: logger.error ("Malformed message") raise