Example #1
0
    def __init__(self, parent=None, firstrun=False):
        super(SettingsDialog, self).__init__(parent)
        widgets.load('settings.ui', self)

        self.parent = parent
        self.firstrun = firstrun
        self.config = BMConfigParser()
        self.net_restart_needed = False
        self.timer = QtCore.QTimer()

        try:
            import pkg_resources
        except ImportError:
            pass
        else:
            # Append proxy types defined in plugins
            for ep in pkg_resources.iter_entry_points(
                    'bitmessage.proxyconfig'):
                self.comboBoxProxyType.addItem(ep.name)

        self.lineEditMaxOutboundConnections.setValidator(
            QtGui.QIntValidator(0, 8, self.lineEditMaxOutboundConnections))

        self.adjust_from_config(self.config)
        if firstrun:
            # switch to "Network Settings" tab if user selected
            # "Let me configure special network settings first" on first run
            self.tabWidgetSettings.setCurrentIndex(
                self.tabWidgetSettings.indexOf(self.tabNetworkSettings))
        QtGui.QWidget.resize(self, QtGui.QWidget.sizeHint(self))
Example #2
0
def readKnownNodes():
    try:
        with open(state.appdata + 'knownnodes.dat', 'rb') as source:
            with knownNodesLock:
                try:
                    json_deserialize_knownnodes(source)
                except ValueError:
                    source.seek(0)
                    pickle_deserialize_old_knownnodes(source)
    except (IOError, OSError, KeyError, EOFError):
        logger.debug('Failed to read nodes from knownnodes.dat', exc_info=True)
        createDefaultKnownNodes()

    config = BMConfigParser()
    # if config.safeGetInt('lmessagesettings', 'settingsversion') > 10:
    #     sys.exit(
    #         'LMessage cannot read future versions of the keys file'
    #         ' (keys.dat). Run the newer version of LMessage.')

    # your own onion address, if setup
    onionhostname = config.safeGet('lmessagesettings', 'onionhostname')
    if onionhostname and ".onion" in onionhostname:
        onionport = config.safeGetInt('lmessagesettings', 'onionport')
        if onionport:
            addKnownNode(1, state.Peer(onionhostname, onionport), is_self=True)
Example #3
0
def reloadMyAddressHashes():
    logger.debug('reloading keys from keys.dat file')
    myECCryptorObjects.clear()
    myAddressesByHash.clear()
    myAddressesByTag.clear()
    #myPrivateKeys.clear()

    keyfileSecure = checkSensitiveFilePermissions(state.appdata + 'keys.dat')
    hasEnabledKeys = False
    for addressInKeysFile in BMConfigParser().addresses():
        isEnabled = BMConfigParser().getboolean(addressInKeysFile, 'enabled')
        if isEnabled:
            hasEnabledKeys = True
            status,addressVersionNumber,streamNumber,hash = decodeAddress(addressInKeysFile)
            if addressVersionNumber == 2 or addressVersionNumber == 3 or addressVersionNumber == 4:
                # Returns a simple 32 bytes of information encoded in 64 Hex characters,
                # or null if there was an error.
                privEncryptionKey = hexlify(decodeWalletImportFormat(
                        BMConfigParser().get(addressInKeysFile, 'privencryptionkey')))

                if len(privEncryptionKey) == 64:#It is 32 bytes encoded as 64 hex characters
                    myECCryptorObjects[hash] = highlevelcrypto.makeCryptor(privEncryptionKey)
                    myAddressesByHash[hash] = addressInKeysFile
                    tag = hashlib.sha512(hashlib.sha512(encodeVarint(
                        addressVersionNumber) + encodeVarint(streamNumber) + hash).digest()).digest()[32:]
                    myAddressesByTag[tag] = addressInKeysFile

            else:
                logger.error('Error in reloadMyAddressHashes: Can\'t handle address versions other than 2, 3, or 4.\n')

    if not keyfileSecure:
        fixSensitiveFilePermissions(state.appdata + 'keys.dat', hasEnabledKeys)
 def __init__(self):
     self._moduleName = BMConfigParser().safeGet("inventory", "storage")
     self._inventoryClass = getattr(
         getattr(storage, self._moduleName),
         "{}Inventory".format(self._moduleName.title()))
     self._realInventory = self._inventoryClass()
     self.numberOfInventoryLookupsPerformed = 0
Example #5
0
    def handle_accept(self):
        """Incoming connection callback"""
        try:
            sock = self.accept()[0]
        except (TypeError, IndexError):
            return

        state.ownAddresses[Peer(*sock.getsockname())] = True
        if (
            len(connectionpool.BMConnectionPool())
            > BMConfigParser().safeGetInt(
                'bitmessagesettings', 'maxtotalconnections')
                + BMConfigParser().safeGetInt(
                    'bitmessagesettings', 'maxbootstrapconnections') + 10
        ):
            # 10 is a sort of buffer, in between it will go through
            # the version handshake and return an error to the peer
            logger.warning("Server full, dropping connection")
            sock.close()
            return
        try:
            connectionpool.BMConnectionPool().addConnection(
                TCPConnection(sock=sock))
        except socket.error:
            pass
Example #6
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
Example #7
0
def getSortedAccounts():
    configSections = filter(lambda x: x != 'bitmessagesettings',
                            BMConfigParser().sections())
    configSections.sort(cmp=lambda x, y: cmp(
        unicode(BMConfigParser().get(x, 'label'), 'utf-8').lower(),
        unicode(BMConfigParser().get(y, 'label'), 'utf-8').lower()))
    return configSections
 def run(self):
     port = BMConfigParser().getint('bitmessagesettings', 'apiport')
     try:
         from errno import WSAEADDRINUSE
     except (ImportError, AttributeError):
         errno.WSAEADDRINUSE = errno.EADDRINUSE
     for attempt in range(50):
         try:
             if attempt > 0:
                 port = randint(32767, 65535)
             se = StoppableXMLRPCServer((BMConfigParser().get(
                 'bitmessagesettings', 'apiinterface'), port),
                                        MySimpleXMLRPCRequestHandler, True,
                                        True)
         except socket.error as e:
             if e.errno in (errno.EADDRINUSE, errno.WSAEADDRINUSE):
                 continue
         else:
             if attempt > 0:
                 BMConfigParser().set("bitmessagesettings", "apiport",
                                      str(port))
                 BMConfigParser().save()
             break
     se.register_introspection_functions()
     se.serve_forever()
Example #9
0
 def HandleListAddresses(self, method):
     data = '{"addresses":['
     for addressInKeysFile in BMConfigParser().addresses():
         status, addressVersionNumber, streamNumber, hash01 = decodeAddress(
             addressInKeysFile)
         if len(data) > 20:
             data += ','
         if BMConfigParser().has_option(addressInKeysFile, 'chan'):
             chan = BMConfigParser().getboolean(addressInKeysFile, 'chan')
         else:
             chan = False
         label = BMConfigParser().get(addressInKeysFile, 'label')
         if method == 'listAddresses2':
             label = base64.b64encode(label)
         data += json.dumps(
             {
                 'label':
                 label,
                 'address':
                 addressInKeysFile,
                 'stream':
                 streamNumber,
                 'enabled':
                 BMConfigParser().getboolean(addressInKeysFile, 'enabled'),
                 'chan':
                 chan
             },
             indent=4,
             separators=(',', ': '))
     data += ']}'
     return data
Example #10
0
 def run(self):
     se = StoppableXMLRPCServer(
         (BMConfigParser().get('bitmessagesettings', 'apiinterface'),
          BMConfigParser().getint('bitmessagesettings', 'apiport')),
         MySimpleXMLRPCRequestHandler, True, True)
     se.register_introspection_functions()
     se.serve_forever()
Example #11
0
    def send(self, fromAddress, toAddress, subject, message):
        """Send a bitmessage"""
        # pylint: disable=arguments-differ
        streamNumber, ripe = decodeAddress(toAddress)[2:]
        stealthLevel = BMConfigParser().safeGetInt('bitmessagesettings',
                                                   'ackstealthlevel')
        ackdata = genAckPayload(streamNumber, stealthLevel)
        sqlExecute(
            '''INSERT INTO sent VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)''',
            '',
            toAddress,
            ripe,
            fromAddress,
            subject,
            message,
            ackdata,
            int(time.time()),  # sentTime (this will never change)
            int(time.time()),  # lastActionTime
            0,  # sleepTill time. This will get set when the POW gets done.
            'msgqueued',
            0,  # retryNumber
            'sent',  # folder
            2,  # encodingtype
            # not necessary to have a TTL higher than 2 days
            min(BMConfigParser().getint('bitmessagesettings', 'ttl'),
                86400 * 2))

        queues.workerQueue.put(('sendmessage', toAddress))
Example #12
0
    def createPortMapping(self, router):
        from debug import logger

        for i in range(50):
            try:
                routerIP, = unpack('>I', socket.inet_aton(router.address))
                localIP = self.localIP
                if i == 0:
                    extPort = self.localPort  # try same port first
                elif i == 1 and self.extPort:
                    extPort = self.extPort  # try external port from last time next
                else:
                    extPort = randint(32767, 65535)
                logger.debug(
                    "Attempt %i, requesting UPnP mapping for %s:%i on external port %i",
                    i, localIP, self.localPort, extPort)
                router.AddPortMapping(extPort, self.localPort, localIP, 'TCP',
                                      'BitMessage')
                shared.extPort = extPort
                self.extPort = extPort
                BMConfigParser().set('bitmessagesettings', 'extport',
                                     str(extPort))
                BMConfigParser().save()
                break
            except UPnPError:
                logger.debug("UPnP error: ", exc_info=True)
    def send(self):
        """Override the send method for gateway accounts"""

        # pylint: disable=unused-variable
        status, addressVersionNumber, streamNumber, ripe = decodeAddress(
            self.toAddress)
        stealthLevel = BMConfigParser().safeGetInt('bitmessagesettings',
                                                   'ackstealthlevel')
        ackdata = genAckPayload(streamNumber, stealthLevel)
        sqlExecute(
            '''INSERT INTO sent VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)''',
            '',
            self.toAddress,
            ripe,
            self.fromAddress,
            self.subject,
            self.message,
            ackdata,
            int(time.time()),  # sentTime (this will never change)
            int(time.time()),  # lastActionTime
            0,  # sleepTill time. This will get set when the POW gets done.
            'msgqueued',
            0,  # retryNumber
            'sent',  # folder
            2,  # encodingtype
            # not necessary to have a TTL higher than 2 days
            min(BMConfigParser().getint('bitmessagesettings', 'ttl'),
                86400 * 2))

        queues.workerQueue.put(('sendmessage', self.toAddress))
def accountClass(address):
    """Return a BMAccount for the address"""
    if not BMConfigParser().has_section(address):
        # .. todo:: This BROADCAST section makes no sense
        if address == str_broadcast_subscribers:
            subscription = BroadcastAccount(address)
            if subscription.type != AccountMixin.BROADCAST:
                return None
        else:
            subscription = SubscriptionAccount(address)
            if subscription.type != AccountMixin.SUBSCRIPTION:
                # e.g. deleted chan
                return NoAccount(address)
        return subscription
    try:
        gateway = BMConfigParser().get(address, "gateway")
        for _, cls in inspect.getmembers(sys.modules[__name__],
                                         inspect.isclass):
            if issubclass(cls, GatewayAccount) and cls.gatewayName == gateway:
                return cls(address)
        # general gateway
        return GatewayAccount(address)
    except:
        pass
    # no gateway
    return BMAccount(address)
    def __init__(self, options=None):
        """
        Initialise.  If options are given, take the connection settings from
        them instead of loading from the configs.  This can be used to test
        currently entered connection settings in the config dialog without
        actually changing the values (yet).
        """
        if options is None:
            self.nmctype = BMConfigParser().get(configSection,
                                                "namecoinrpctype")
            self.host = BMConfigParser().get(configSection, "namecoinrpchost")
            self.port = int(BMConfigParser().get(configSection,
                                                 "namecoinrpcport"))
            self.user = BMConfigParser().get(configSection, "namecoinrpcuser")
            self.password = BMConfigParser().get(configSection,
                                                 "namecoinrpcpassword")
        else:
            self.nmctype = options["type"]
            self.host = options["host"]
            self.port = int(options["port"])
            self.user = options["user"]
            self.password = options["password"]

        assert self.nmctype == "namecoind" or self.nmctype == "nmcontrol"
        if self.nmctype == "namecoind":
            self.con = httplib.HTTPConnection(self.host, self.port, timeout=3)
Example #16
0
def connectToStream(streamNumber):
    state.streamsInWhichIAmParticipating.append(streamNumber)
    selfInitiatedConnections[streamNumber] = {}

    if isOurOperatingSystemLimitedToHavingVeryFewHalfOpenConnections():
        # Some XP and Vista systems can only have 10 outgoing connections at a time.
        state.maximumNumberOfHalfOpenConnections = 9
    else:
        state.maximumNumberOfHalfOpenConnections = 64
    try:
        # don't overload Tor
        if BMConfigParser().get('bitmessagesettings',
                                'socksproxytype') != 'none':
            state.maximumNumberOfHalfOpenConnections = 4
    except:
        pass

    with knownnodes.knownNodesLock:
        if streamNumber not in knownnodes.knownNodes:
            knownnodes.knownNodes[streamNumber] = {}
        if streamNumber * 2 not in knownnodes.knownNodes:
            knownnodes.knownNodes[streamNumber * 2] = {}
        if streamNumber * 2 + 1 not in knownnodes.knownNodes:
            knownnodes.knownNodes[streamNumber * 2 + 1] = {}

    if BMConfigParser().get("network", "asyncore"):
        BMConnectionPool().connectToStream(streamNumber)
    else:
        for i in range(state.maximumNumberOfHalfOpenConnections):
            a = outgoingSynSender()
            a.setup(streamNumber, selfInitiatedConnections)
            a.start()
def assembleVersionMessage(remoteHost, remotePort, participatingStreams, server = False, nodeid = None):
    payload = ''
    payload += pack('>L', 3)  # protocol version.
    # bitflags of the services I offer.
    payload += pack('>q', 
            NODE_NETWORK |
            (NODE_SSL if haveSSL(server) else 0) |
            (NODE_DANDELION if state.dandelion else 0)
            )
    payload += pack('>q', int(time.time()))

    payload += pack(
        '>q', 1)  # boolservices of remote connection; ignored by the remote host.
    if checkSocksIP(remoteHost) and server: # prevent leaking of tor outbound IP
        payload += encodeHost('127.0.0.1')
        payload += pack('>H', 8444)
    else:
        payload += encodeHost(remoteHost)
        payload += pack('>H', remotePort)  # remote IPv6 and port

    # bitflags of the services I offer.
    payload += pack('>q',
            NODE_NETWORK |
            (NODE_SSL if haveSSL(server) else 0) |
            (NODE_DANDELION if state.dandelion else 0)
            )
    payload += '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF' + pack(
        '>L', 2130706433)  # = 127.0.0.1. This will be ignored by the remote host. The actual remote connected IP will be used.
    # we have a separate extPort and
    # incoming over clearnet or
    # outgoing through clearnet
    if BMConfigParser().safeGetBoolean('bitmessagesettings', 'upnp') and state.extPort \
        and ((server and not checkSocksIP(remoteHost)) or \
        (BMConfigParser().get("bitmessagesettings", "socksproxytype") == "none" and not server)):
        payload += pack('>H', state.extPort)
    elif checkSocksIP(remoteHost) and server: # incoming connection over Tor
        payload += pack('>H', BMConfigParser().getint('bitmessagesettings', 'onionport'))
    else: # no extPort and not incoming over Tor
        payload += pack('>H', BMConfigParser().getint('bitmessagesettings', 'port'))

    random.seed()
    if nodeid is not None:
        payload += nodeid[0:8]
    else:
        payload += eightBytesOfRandomDataUsedToDetectConnectionsToSelf
    userAgent = '/PyBitmessage:' + softwareVersion + '/'
    payload += encodeVarint(len(userAgent))
    payload += userAgent

    # Streams
    payload += encodeVarint(len(participatingStreams))
    count = 0
    for stream in sorted(participatingStreams):
        payload += encodeVarint(stream)
        count += 1
        # protocol limit, see specification
        if count >= 160000:
            break

    return CreatePacket('version', payload)
 def getApiAddress(self):
     if not BMConfigParser().safeGetBoolean('bitmessagesettings',
                                            'apienabled'):
         return None
     address = BMConfigParser().get('bitmessagesettings', 'apiinterface')
     port = BMConfigParser().getint('bitmessagesettings', 'apiport')
     return {'address': address, 'port': port}
Example #19
0
 def rerenderBlackWhiteList(self):
     tabs = self.parent().parent()
     if BMConfigParser().get('bitmessagesettings', 'blackwhitelist') == 'black':
         tabs.setTabText(tabs.indexOf(self), _translate('blacklist', 'Blacklist'))
     else:
         tabs.setTabText(tabs.indexOf(self), _translate('blacklist', 'Whitelist'))
     self.tableWidgetBlacklist.setRowCount(0)
     listType = BMConfigParser().get('bitmessagesettings', 'blackwhitelist')
     if listType == 'black':
         queryreturn = sqlQuery('''SELECT label, address, enabled FROM blacklist''')
     else:
         queryreturn = sqlQuery('''SELECT label, address, enabled FROM whitelist''')
     self.tableWidgetBlacklist.setSortingEnabled(False)
     for row in queryreturn:
         label, address, enabled = row
         self.tableWidgetBlacklist.insertRow(0)
         newItem = QtGui.QTableWidgetItem(unicode(label, 'utf-8'))
         if not enabled:
             newItem.setTextColor(QtGui.QColor(128, 128, 128))
         newItem.setIcon(avatarize(address))
         self.tableWidgetBlacklist.setItem(0, 0, newItem)
         newItem = QtGui.QTableWidgetItem(address)
         newItem.setFlags(
             QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
         if not enabled:
             newItem.setTextColor(QtGui.QColor(128, 128, 128))
         self.tableWidgetBlacklist.setItem(0, 1, newItem)
     self.tableWidgetBlacklist.setSortingEnabled(True)
Example #20
0
 def click_radioButtonWhitelist(self):
     if BMConfigParser().get('bitmessagesettings', 'blackwhitelist') == 'black':
         BMConfigParser().set('bitmessagesettings', 'blackwhitelist', 'white')
         BMConfigParser().save()
         # self.tableWidgetBlacklist.clearContents()
         self.tableWidgetBlacklist.setRowCount(0)
         self.rerenderBlackWhiteList()
Example #21
0
def loadKnownNodes():
    try:
        # We shouldn't have to use the knownnodes.knownNodesLock because this had
        # better be the only thread accessing knownNodes right now.
        pickleFile = open(state.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():
            knownNodes[stream] = {}
            for node_tuple in nodes.items():
                try:
                    host, (port, lastseen) = node_tuple
                    peer = state.Peer(host, port)
                except:
                    peer, lastseen = node_tuple
                knownNodes[stream][peer] = lastseen
    except:
        createDefaultKnownNodes(state.appdata)
    # your own onion address, if setup
    if BMConfigParser().has_option(
            'bitmessagesettings',
            'onionhostname') and ".onion" in BMConfigParser().get(
                'bitmessagesettings', 'onionhostname'):
        knownNodes[1][state.Peer(
            BMConfigParser().get('bitmessagesettings', 'onionhostname'),
            BMConfigParser().getint('bitmessagesettings',
                                    'onionport'))] = int(time.time())
    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
Example #22
0
    def process_message(self, peer, mailfrom, rcpttos, data):
        """Process an email"""
        # pylint: disable=too-many-locals, too-many-branches
        # print 'Receiving message from:', peer
        p = re.compile(".*<([^>]+)>")
        if not hasattr(self.channel, "auth") or not self.channel.auth:
            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: %r', mailfrom, 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: %r', msg_from, 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: %r', to, err)
                continue
        return
Example #23
0
def createSupportMessage(myapp):
    checkAddressBook(myapp)
    address = createAddressIfNeeded(myapp)
    if state.shutdown:
        return

    myapp.ui.lineEditSubject.setText(str(QtGui.QApplication.translate("Support", SUPPORT_SUBJECT)))
    addrIndex = myapp.ui.comboBoxSendFrom.findData(address, QtCore.Qt.UserRole, QtCore.Qt.MatchFixedString | QtCore.Qt.MatchCaseSensitive)
    if addrIndex == -1: # something is very wrong
        return
    myapp.ui.comboBoxSendFrom.setCurrentIndex(addrIndex)
    myapp.ui.lineEditTo.setText(SUPPORT_ADDRESS)
    
    version = softwareVersion
    commit = paths.lastCommit()
    if commit:
        version += " GIT " + commit

    os = sys.platform
    if os == "win32":
        windowsversion = sys.getwindowsversion()
        os = "Windows " + str(windowsversion[0]) + "." + str(windowsversion[1])
    else:
        try:
            from os import uname
            unixversion = uname()
            os = unixversion[0] + " " + unixversion[2]
        except:
            pass
    architecture = "32" if ctypes.sizeof(ctypes.c_voidp) == 4 else "64"
    pythonversion = sys.version
    
    opensslversion = "%s (Python internal), %s (external for PyElliptic)" % (ssl.OPENSSL_VERSION, OpenSSL._version)

    frozen = "N/A"
    if paths.frozen:
        frozen = paths.frozen
    portablemode = "True" if state.appdata == paths.lookupExeFolder() else "False"
    cpow = "True" if bmpow else "False"
    #cpow = QtGui.QApplication.translate("Support", cpow)
    openclpow = str(BMConfigParser().safeGet('bitmessagesettings', 'opencl')) if openclEnabled() else "None"
    #openclpow = QtGui.QApplication.translate("Support", openclpow)
    locale = getTranslationLanguage()
    try:
        socks = BMConfigParser().get('bitmessagesettings', 'socksproxytype')
    except:
        socks = "N/A"
    try:
        upnp = BMConfigParser().get('bitmessagesettings', 'upnp')
    except:
        upnp = "N/A"
    connectedhosts = len(shared.connectedHostsList)

    myapp.ui.textEditMessage.setText(str(QtGui.QApplication.translate("Support", SUPPORT_MESSAGE)).format(version, os, architecture, pythonversion, opensslversion, frozen, portablemode, cpow, openclpow, locale, socks, upnp, connectedhosts))

    # single msg tab
    myapp.ui.tabWidgetSend.setCurrentIndex(0)
    # send tab
    myapp.ui.tabWidget.setCurrentIndex(1)
Example #24
0
 def getApiAddress():
     """This function returns API address and port"""
     if not BMConfigParser().safeGetBoolean(
             'bitmessagesettings', 'apienabled'):
         return None
     address = BMConfigParser().get('bitmessagesettings', 'apiinterface')
     port = BMConfigParser().getint('bitmessagesettings', 'apiport')
     return {'address': address, 'port': port}
Example #25
0
 def setData(self, column, role, value):
     if role == QtCore.Qt.EditRole and self.type != AccountMixin.SUBSCRIPTION:
         if isinstance(value, QtCore.QVariant):
             BMConfigParser().set(str(self.address), 'label', str(value.toString().toUtf8()))
         else:
             BMConfigParser().set(str(self.address), 'label', str(value))
         BMConfigParser().save()
     return super(Ui_AddressWidget, self).setData(column, role, value)
Example #26
0
def getTranslationLanguage():
    userlocale = None
    if BMConfigParser().has_option('lmessagesettings', 'userlocale'):
        userlocale = BMConfigParser().get('lmessagesettings', 'userlocale')

    if userlocale in [None, '', 'system']:
        return language

    return userlocale
Example #27
0
    def bm_command_object(self):
        objectOffset = self.payloadOffset
        nonce, expiresTime, objectType, version, streamNumber = self.decode_payload_content(
            "QQIvv")
        self.object = BMObject(nonce, expiresTime, objectType, version,
                               streamNumber, self.payload, self.payloadOffset)

        if len(self.payload
               ) - self.payloadOffset > BMProto.maxObjectPayloadSize:
            logger.info(
                'The payload length of this object is too large (%d bytes). Ignoring it.'
                % (len(self.payload) - self.payloadOffset))
            raise BMProtoExcessiveDataError()

        try:
            self.object.checkProofOfWorkSufficient()
            self.object.checkEOLSanity()
            self.object.checkAlreadyHave()
        except (BMObjectExpiredError, BMObjectAlreadyHaveError,
                BMObjectInsufficientPOWError) as e:
            BMProto.stopDownloadingObject(self.object.inventoryHash)
            raise e
        try:
            self.object.checkStream()
        except (BMObjectUnwantedStreamError, ) as e:
            BMProto.stopDownloadingObject(
                self.object.inventoryHash,
                BMConfigParser().get("inventory", "acceptmismatch"))
            if not BMConfigParser().get("inventory", "acceptmismatch"):
                raise e

        try:
            self.object.checkObjectByType()
            objectProcessorQueue.put(
                (self.object.objectType, buffer(self.object.data)))
        except BMObjectInvalidError as e:
            BMProto.stopDownloadingObject(self.object.inventoryHash, True)
        else:
            try:
                del state.missingObjects[self.object.inventoryHash]
            except KeyError:
                pass

        if self.object.inventoryHash in Inventory() and Dandelion().hasHash(
                self.object.inventoryHash):
            Dandelion().removeHash(self.object.inventoryHash,
                                   "cycle detection")

        Inventory()[self.object.inventoryHash] = (
            self.object.objectType, self.object.streamNumber,
            buffer(self.payload[objectOffset:]), self.object.expiresTime,
            buffer(self.object.tag))
        self.handleReceivedObject(self.object.streamNumber,
                                  self.object.inventoryHash)
        invQueue.put((self.object.streamNumber, self.object.inventoryHash,
                      self.destination))
        return True
def ensureNamecoinOptions():
    """
    Ensure all namecoin options are set, by setting those to default values
    that aren't there.
    """

    if not BMConfigParser().has_option(configSection, "namecoinrpctype"):
        BMConfigParser().set(configSection, "namecoinrpctype", "namecoind")
    if not BMConfigParser().has_option(configSection, "namecoinrpchost"):
        BMConfigParser().set(configSection, "namecoinrpchost", "localhost")

    hasUser = BMConfigParser().has_option(configSection, "namecoinrpcuser")
    hasPass = BMConfigParser().has_option(configSection, "namecoinrpcpassword")
    hasPort = BMConfigParser().has_option(configSection, "namecoinrpcport")

    # Try to read user/password from .namecoin configuration file.
    defaultUser = ""
    defaultPass = ""
    nmcFolder = lookupNamecoinFolder()
    nmcConfig = nmcFolder + "namecoin.conf"
    try:
        nmc = open(nmcConfig, "r")

        while True:
            line = nmc.readline()
            if line == "":
                break
            parts = line.split("=")
            if len(parts) == 2:
                key = parts[0]
                val = parts[1].rstrip()

                if key == "rpcuser" and not hasUser:
                    defaultUser = val
                if key == "rpcpassword" and not hasPass:
                    defaultPass = val
                if key == "rpcport":
                    defaults.namecoinDefaultRpcPort = val

        nmc.close()
    except IOError:
        logger.warning(
            "%s unreadable or missing, Namecoin support deactivated",
            nmcConfig)
    except Exception:
        logger.warning("Error processing namecoin.conf", exc_info=True)

    # If still nothing found, set empty at least.
    if not hasUser:
        BMConfigParser().set(configSection, "namecoinrpcuser", defaultUser)
    if not hasPass:
        BMConfigParser().set(configSection, "namecoinrpcpassword", defaultPass)

    # Set default port now, possibly to found value.
    if not hasPort:
        BMConfigParser().set(configSection, "namecoinrpcport",
                             defaults.namecoinDefaultRpcPort)
Example #29
0
def _loadTrustedPeer():
    try:
        trustedPeer = BMConfigParser().get('bitmessagesettings', 'trustedpeer')
    except ConfigParser.Error:
        # This probably means the trusted peer wasn't specified so we
        # can just leave it as None
        return

    host, port = trustedPeer.split(':')
    state.trustedPeer = state.Peer(host, int(port))
Example #30
0
def _loadTrustedPeer():
    try:
        trustedPeer = BMConfigParser().get('bitmessagesettings', 'trustedpeer')
    except ConfigParser.Error:
        # This probably means the trusted peer wasn't specified so we
        # can just leave it as None
        return

    host, port = trustedPeer.split(':')
    state.trustedPeer = state.Peer(host, int(port))
Example #31
0
 def setData(self, column, role, value):
     """Save account label (if you edit in the the UI, this will be triggered and will save it to keys.dat)"""
     if role == QtCore.Qt.EditRole \
             and self.type != AccountMixin.SUBSCRIPTION:
         BMConfigParser().set(
             str(self.address), 'label',
             str(value.toString().toUtf8()) if isinstance(
                 value, QtCore.QVariant) else value.encode('utf-8'))
         BMConfigParser().save()
     return super(Ui_AddressWidget, self).setData(column, role, value)
Example #32
0
 def __init__(self):
     #super(self.__class__, self).__init__()
     self._moduleName = BMConfigParser().safeGet("inventory", "storage")
     #import_module("." + self._moduleName, "storage")
     #import_module("storage." + self._moduleName)
     self._className = "storage." + self._moduleName + "." + self._moduleName.title() + "Inventory"
     self._inventoryClass = eval(self._className)
     self._realInventory = self._inventoryClass()
     self.numberOfInventoryLookupsPerformed = 0
Example #33
0
class Inventory():
    def __init__(self):
        #super(self.__class__, self).__init__()
        self._moduleName = BMConfigParser().safeGet("inventory", "storage")
        #import_module("." + self._moduleName, "storage")
        #import_module("storage." + self._moduleName)
        self._className = "storage." + self._moduleName + "." + self._moduleName.title() + "Inventory"
        self._inventoryClass = eval(self._className)
        self._realInventory = self._inventoryClass()
        self.numberOfInventoryLookupsPerformed = 0

    # cheap inheritance copied from asyncore
    def __getattr__(self, attr):
        try:
            if attr == "__contains__":
                self.numberOfInventoryLookupsPerformed += 1
            realRet = getattr(self._realInventory, attr)
        except AttributeError:
            raise AttributeError("%s instance has no attribute '%s'" %(self.__class__.__name__, attr))
        else:
            return realRet
Example #34
0
def getSortedAccounts():
    configSections = BMConfigParser().addresses()
    configSections.sort(cmp = 
        lambda x,y: cmp(unicode(BMConfigParser().get(x, 'label'), 'utf-8').lower(), unicode(BMConfigParser().get(y, 'label'), 'utf-8').lower())
        )
    return configSections