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))
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)
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
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
def knownNodes(): try: with open(state.appdata + 'knownnodes.dat', 'rb') as pickleFile: with knownnodes.knownNodesLock: knownnodes.knownNodes = pickle.load(pickleFile) # the old format was {Peer:lastseen, ...} # the new format is {Peer:{"lastseen":i, "rating":f}} for stream in knownnodes.knownNodes.keys(): for node, params in knownnodes.knownNodes[stream].items(): if isinstance(params, (float, int)): addKnownNode(stream, node, params) except: knownnodes.knownNodes = defaultKnownNodes.createDefaultKnownNodes( state.appdata) # your own onion address, if setup if BMConfigParser().has_option( 'bitmessagesettings', 'onionhostname') and ".onion" in BMConfigParser().get( 'bitmessagesettings', 'onionhostname'): addKnownNode(1, state.Peer( BMConfigParser().get('bitmessagesettings', 'onionhostname'), BMConfigParser().getint('bitmessagesettings', 'onionport')), self=True) if BMConfigParser().getint('bitmessagesettings', 'settingsversion') > 10: logger.error( 'Bitmessage cannot read future versions of the keys file (keys.dat). Run the newer version of Bitmessage.' ) raise SystemExit
def 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()
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
def run(self): se = StoppableXMLRPCServer( (BMConfigParser().get('bitmessagesettings', 'apiinterface'), BMConfigParser().getint('bitmessagesettings', 'apiport')), MySimpleXMLRPCRequestHandler, True, True) se.register_introspection_functions() se.serve_forever()
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))
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)
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}
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)
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()
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
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
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)
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}
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)
def getTranslationLanguage(): userlocale = None if BMConfigParser().has_option('lmessagesettings', 'userlocale'): userlocale = BMConfigParser().get('lmessagesettings', 'userlocale') if userlocale in [None, '', 'system']: return language return userlocale
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)
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))
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)
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
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
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