Beispiel #1
0
 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)
Beispiel #2
0
 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
Beispiel #3
0
 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
Beispiel #4
0
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
Beispiel #5
0
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
Beispiel #7
0
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[:]
Beispiel #8
0
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
Beispiel #9
0
    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.')
Beispiel #11
0
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
Beispiel #12
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)
Beispiel #15
0
 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()
Beispiel #17
0
    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
Beispiel #19
0
 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
Beispiel #20
0
 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
Beispiel #21
0
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()
Beispiel #22
0
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()
Beispiel #23
0
 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)
Beispiel #24
0
 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)
Beispiel #26
0
 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."))
Beispiel #28
0
 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")
Beispiel #29
0
    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
Beispiel #31
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.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]
Beispiel #32
0
    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)
Beispiel #33
0
    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
Beispiel #34
0
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.'
Beispiel #35
0
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.'
Beispiel #36
0
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.'
Beispiel #37
0
    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
Beispiel #38
0
    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
Beispiel #39
0
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.'
Beispiel #40
0
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.'
Beispiel #42
0
 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")
Beispiel #43
0
 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
Beispiel #45
0
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
Beispiel #46
0
 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
Beispiel #47
0
    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
Beispiel #49
0
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
Beispiel #51
0
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
Beispiel #53
0
    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
Beispiel #54
0
    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.')
Beispiel #56
0
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
Beispiel #57
0
 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