Added some API commands for use with a mobile app #391
|
@ -2000,6 +2000,8 @@ class MyForm(QtGui.QMainWindow):
|
|||
self.settingsDialogInstance.ui.checkBoxShowTrayNotifications.isChecked()))
|
||||
shared.config.set('bitmessagesettings', 'startintray', str(
|
||||
self.settingsDialogInstance.ui.checkBoxStartInTray.isChecked()))
|
||||
shared.config.set('bitmessagesettings', 'willinglysendtomobile', str(
|
||||
self.settingsDialogInstance.ui.checkBoxWillinglySendToMobile.isChecked()))
|
||||
if int(shared.config.get('bitmessagesettings', 'port')) != int(self.settingsDialogInstance.ui.lineEditTCPPort.text()):
|
||||
if not shared.safeConfigGetBoolean('bitmessagesettings', 'dontconnect'):
|
||||
QMessageBox.about(self, _translate("MainWindow", "Restart"), _translate(
|
||||
|
@ -2996,6 +2998,8 @@ class settingsDialog(QtGui.QDialog):
|
|||
shared.config.getboolean('bitmessagesettings', 'showtraynotifications'))
|
||||
self.ui.checkBoxStartInTray.setChecked(
|
||||
shared.config.getboolean('bitmessagesettings', 'startintray'))
|
||||
self.ui.checkBoxWillinglySendToMobile.setChecked(
|
||||
shared.safeConfigGetBoolean('bitmessagesettings', 'willinglysendtomobile'))
|
||||
if shared.appdata == '':
|
||||
self.ui.checkBoxPortableMode.setChecked(True)
|
||||
if 'darwin' in sys.platform:
|
||||
|
|
|
@ -2,8 +2,8 @@
|
|||
|
||||
# Form implementation generated from reading ui file 'newchandialog.ui'
|
||||
#
|
||||
# Created: Mon Jul 22 01:05:35 2013
|
||||
# by: PyQt4 UI code generator 4.10.2
|
||||
# Created: Wed Aug 7 16:51:29 2013
|
||||
# by: PyQt4 UI code generator 4.10
|
||||
#
|
||||
# WARNING! All changes made in this file will be lost!
|
||||
|
||||
|
@ -26,7 +26,7 @@ except AttributeError:
|
|||
class Ui_newChanDialog(object):
|
||||
def setupUi(self, newChanDialog):
|
||||
newChanDialog.setObjectName(_fromUtf8("newChanDialog"))
|
||||
newChanDialog.resize(530, 422)
|
||||
newChanDialog.resize(553, 422)
|
||||
newChanDialog.setMinimumSize(QtCore.QSize(0, 0))
|
||||
self.formLayout = QtGui.QFormLayout(newChanDialog)
|
||||
self.formLayout.setObjectName(_fromUtf8("formLayout"))
|
||||
|
@ -87,13 +87,18 @@ class Ui_newChanDialog(object):
|
|||
QtCore.QObject.connect(self.radioButtonJoinChan, QtCore.SIGNAL(_fromUtf8("toggled(bool)")), self.groupBoxJoinChan.setShown)
|
||||
QtCore.QObject.connect(self.radioButtonCreateChan, QtCore.SIGNAL(_fromUtf8("toggled(bool)")), self.groupBoxCreateChan.setShown)
|
||||
QtCore.QMetaObject.connectSlotsByName(newChanDialog)
|
||||
newChanDialog.setTabOrder(self.radioButtonJoinChan, self.radioButtonCreateChan)
|
||||
newChanDialog.setTabOrder(self.radioButtonCreateChan, self.lineEditChanNameCreate)
|
||||
newChanDialog.setTabOrder(self.lineEditChanNameCreate, self.lineEditChanNameJoin)
|
||||
newChanDialog.setTabOrder(self.lineEditChanNameJoin, self.lineEditChanBitmessageAddress)
|
||||
newChanDialog.setTabOrder(self.lineEditChanBitmessageAddress, self.buttonBox)
|
||||
|
||||
def retranslateUi(self, newChanDialog):
|
||||
newChanDialog.setWindowTitle(_translate("newChanDialog", "Dialog", None))
|
||||
self.radioButtonCreateChan.setText(_translate("newChanDialog", "Create a new chan", None))
|
||||
self.radioButtonJoinChan.setText(_translate("newChanDialog", "Join a chan", None))
|
||||
self.groupBoxCreateChan.setTitle(_translate("newChanDialog", "Create a chan", None))
|
||||
self.label_4.setText(_translate("newChanDialog", "Enter a name for your chan. If you choose a sufficiently complex chan name (like a strong and unique passphrase) and none of your friends share it publicly then the chan will be secure and private.", None))
|
||||
self.label_4.setText(_translate("newChanDialog", "<html><head/><body><p>Enter a name for your chan. If you choose a sufficiently complex chan name (like a strong and unique passphrase) and none of your friends share it publicly then the chan will be secure and private. If you and someone else both create a chan with the same chan name then it is currently very likely that they will be the same chan.</p></body></html>", None))
|
||||
self.label_5.setText(_translate("newChanDialog", "Chan name:", None))
|
||||
self.groupBoxJoinChan.setTitle(_translate("newChanDialog", "Join a chan", None))
|
||||
self.label.setText(_translate("newChanDialog", "<html><head/><body><p>A chan exists when a group of people share the same decryption keys. The keys and bitmessage address used by a chan are generated from a human-friendly word or phrase (the chan name). To send a message to everyone in the chan, send a normal person-to-person message to the chan address.</p><p>Chans are experimental and completely unmoderatable.</p></body></html>", None))
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>530</width>
|
||||
<width>553</width>
|
||||
<height>422</height>
|
||||
</rect>
|
||||
</property>
|
||||
|
@ -46,7 +46,7 @@
|
|||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="text">
|
||||
<string>Enter a name for your chan. If you choose a sufficiently complex chan name (like a strong and unique passphrase) and none of your friends share it publicly then the chan will be secure and private.</string>
|
||||
<string><html><head/><body><p>Enter a name for your chan. If you choose a sufficiently complex chan name (like a strong and unique passphrase) and none of your friends share it publicly then the chan will be secure and private. If you and someone else both create a chan with the same chan name then it is currently very likely that they will be the same chan.</p></body></html></string>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
|
@ -130,6 +130,14 @@
|
|||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<tabstops>
|
||||
<tabstop>radioButtonJoinChan</tabstop>
|
||||
<tabstop>radioButtonCreateChan</tabstop>
|
||||
<tabstop>lineEditChanNameCreate</tabstop>
|
||||
<tabstop>lineEditChanNameJoin</tabstop>
|
||||
<tabstop>lineEditChanBitmessageAddress</tabstop>
|
||||
<tabstop>buttonBox</tabstop>
|
||||
</tabstops>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
|
|
|
@ -2,8 +2,8 @@
|
|||
|
||||
# Form implementation generated from reading ui file 'settings.ui'
|
||||
#
|
||||
# Created: Fri Jul 12 12:37:53 2013
|
||||
# by: PyQt4 UI code generator 4.10.1
|
||||
# Created: Wed Aug 7 16:58:45 2013
|
||||
# by: PyQt4 UI code generator 4.10
|
||||
#
|
||||
# WARNING! All changes made in this file will be lost!
|
||||
|
||||
|
@ -26,7 +26,7 @@ except AttributeError:
|
|||
class Ui_settingsDialog(object):
|
||||
def setupUi(self, settingsDialog):
|
||||
settingsDialog.setObjectName(_fromUtf8("settingsDialog"))
|
||||
settingsDialog.resize(445, 343)
|
||||
settingsDialog.resize(462, 343)
|
||||
self.gridLayout = QtGui.QGridLayout(settingsDialog)
|
||||
self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
|
||||
self.buttonBox = QtGui.QDialogButtonBox(settingsDialog)
|
||||
|
@ -41,33 +41,36 @@ class Ui_settingsDialog(object):
|
|||
self.tabUserInterface.setObjectName(_fromUtf8("tabUserInterface"))
|
||||
self.gridLayout_5 = QtGui.QGridLayout(self.tabUserInterface)
|
||||
self.gridLayout_5.setObjectName(_fromUtf8("gridLayout_5"))
|
||||
self.checkBoxStartOnLogon = QtGui.QCheckBox(self.tabUserInterface)
|
||||
self.checkBoxStartOnLogon.setObjectName(_fromUtf8("checkBoxStartOnLogon"))
|
||||
self.gridLayout_5.addWidget(self.checkBoxStartOnLogon, 0, 0, 1, 1)
|
||||
self.checkBoxStartInTray = QtGui.QCheckBox(self.tabUserInterface)
|
||||
self.checkBoxStartInTray.setObjectName(_fromUtf8("checkBoxStartInTray"))
|
||||
self.gridLayout_5.addWidget(self.checkBoxStartInTray, 1, 0, 1, 1)
|
||||
self.checkBoxMinimizeToTray = QtGui.QCheckBox(self.tabUserInterface)
|
||||
self.checkBoxMinimizeToTray.setChecked(True)
|
||||
self.checkBoxMinimizeToTray.setObjectName(_fromUtf8("checkBoxMinimizeToTray"))
|
||||
self.gridLayout_5.addWidget(self.checkBoxMinimizeToTray, 2, 0, 1, 1)
|
||||
self.checkBoxShowTrayNotifications = QtGui.QCheckBox(self.tabUserInterface)
|
||||
self.checkBoxShowTrayNotifications.setObjectName(_fromUtf8("checkBoxShowTrayNotifications"))
|
||||
self.gridLayout_5.addWidget(self.checkBoxShowTrayNotifications, 3, 0, 1, 1)
|
||||
self.checkBoxPortableMode = QtGui.QCheckBox(self.tabUserInterface)
|
||||
self.checkBoxPortableMode.setObjectName(_fromUtf8("checkBoxPortableMode"))
|
||||
self.gridLayout_5.addWidget(self.checkBoxPortableMode, 4, 0, 1, 1)
|
||||
self.label_7 = QtGui.QLabel(self.tabUserInterface)
|
||||
self.label_7.setWordWrap(True)
|
||||
self.label_7.setObjectName(_fromUtf8("label_7"))
|
||||
self.gridLayout_5.addWidget(self.label_7, 5, 0, 1, 1)
|
||||
self.labelSettingsNote = QtGui.QLabel(self.tabUserInterface)
|
||||
self.labelSettingsNote.setText(_fromUtf8(""))
|
||||
self.labelSettingsNote.setWordWrap(True)
|
||||
self.labelSettingsNote.setObjectName(_fromUtf8("labelSettingsNote"))
|
||||
self.gridLayout_5.addWidget(self.labelSettingsNote, 6, 0, 1, 1)
|
||||
self.gridLayout_5.addWidget(self.labelSettingsNote, 7, 0, 1, 1)
|
||||
spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
|
||||
self.gridLayout_5.addItem(spacerItem, 7, 0, 1, 1)
|
||||
self.gridLayout_5.addItem(spacerItem, 8, 0, 1, 1)
|
||||
self.checkBoxStartInTray = QtGui.QCheckBox(self.tabUserInterface)
|
||||
self.checkBoxStartInTray.setObjectName(_fromUtf8("checkBoxStartInTray"))
|
||||
self.gridLayout_5.addWidget(self.checkBoxStartInTray, 1, 0, 1, 1)
|
||||
self.checkBoxShowTrayNotifications = QtGui.QCheckBox(self.tabUserInterface)
|
||||
self.checkBoxShowTrayNotifications.setObjectName(_fromUtf8("checkBoxShowTrayNotifications"))
|
||||
self.gridLayout_5.addWidget(self.checkBoxShowTrayNotifications, 3, 0, 1, 1)
|
||||
self.checkBoxMinimizeToTray = QtGui.QCheckBox(self.tabUserInterface)
|
||||
self.checkBoxMinimizeToTray.setChecked(True)
|
||||
self.checkBoxMinimizeToTray.setObjectName(_fromUtf8("checkBoxMinimizeToTray"))
|
||||
self.gridLayout_5.addWidget(self.checkBoxMinimizeToTray, 2, 0, 1, 1)
|
||||
self.label_7 = QtGui.QLabel(self.tabUserInterface)
|
||||
self.label_7.setWordWrap(True)
|
||||
self.label_7.setObjectName(_fromUtf8("label_7"))
|
||||
self.gridLayout_5.addWidget(self.label_7, 5, 0, 1, 1)
|
||||
self.checkBoxStartOnLogon = QtGui.QCheckBox(self.tabUserInterface)
|
||||
self.checkBoxStartOnLogon.setObjectName(_fromUtf8("checkBoxStartOnLogon"))
|
||||
self.gridLayout_5.addWidget(self.checkBoxStartOnLogon, 0, 0, 1, 1)
|
||||
self.checkBoxPortableMode = QtGui.QCheckBox(self.tabUserInterface)
|
||||
self.checkBoxPortableMode.setObjectName(_fromUtf8("checkBoxPortableMode"))
|
||||
self.gridLayout_5.addWidget(self.checkBoxPortableMode, 4, 0, 1, 1)
|
||||
self.checkBoxWillinglySendToMobile = QtGui.QCheckBox(self.tabUserInterface)
|
||||
self.checkBoxWillinglySendToMobile.setObjectName(_fromUtf8("checkBoxWillinglySendToMobile"))
|
||||
self.gridLayout_5.addWidget(self.checkBoxWillinglySendToMobile, 6, 0, 1, 1)
|
||||
self.tabWidgetSettings.addTab(self.tabUserInterface, _fromUtf8(""))
|
||||
self.tabNetworkSettings = QtGui.QWidget()
|
||||
self.tabNetworkSettings.setObjectName(_fromUtf8("tabNetworkSettings"))
|
||||
|
@ -252,12 +255,13 @@ class Ui_settingsDialog(object):
|
|||
|
||||
def retranslateUi(self, settingsDialog):
|
||||
settingsDialog.setWindowTitle(_translate("settingsDialog", "Settings", None))
|
||||
self.checkBoxStartOnLogon.setText(_translate("settingsDialog", "Start Bitmessage on user login", None))
|
||||
self.checkBoxStartInTray.setText(_translate("settingsDialog", "Start Bitmessage in the tray (don\'t show main window)", None))
|
||||
self.checkBoxMinimizeToTray.setText(_translate("settingsDialog", "Minimize to tray", None))
|
||||
self.checkBoxShowTrayNotifications.setText(_translate("settingsDialog", "Show notification when message received", None))
|
||||
self.checkBoxPortableMode.setText(_translate("settingsDialog", "Run in Portable Mode", None))
|
||||
self.checkBoxMinimizeToTray.setText(_translate("settingsDialog", "Minimize to tray", None))
|
||||
self.label_7.setText(_translate("settingsDialog", "In Portable Mode, messages and config files are stored in the same directory as the program rather than the normal application-data folder. This makes it convenient to run Bitmessage from a USB thumb drive.", None))
|
||||
self.checkBoxStartOnLogon.setText(_translate("settingsDialog", "Start Bitmessage on user login", None))
|
||||
self.checkBoxPortableMode.setText(_translate("settingsDialog", "Run in Portable Mode", None))
|
||||
self.checkBoxWillinglySendToMobile.setText(_translate("settingsDialog", "Willingly include unencrypted destination address when sending to a mobile device", None))
|
||||
self.tabWidgetSettings.setTabText(self.tabWidgetSettings.indexOf(self.tabUserInterface), _translate("settingsDialog", "User Interface", None))
|
||||
self.groupBox.setTitle(_translate("settingsDialog", "Listening port", None))
|
||||
self.label.setText(_translate("settingsDialog", "Listen for connections on port:", None))
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>445</width>
|
||||
<width>462</width>
|
||||
<height>343</height>
|
||||
</rect>
|
||||
</property>
|
||||
|
@ -37,13 +37,29 @@
|
|||
<string>User Interface</string>
|
||||
</attribute>
|
||||
<layout class="QGridLayout" name="gridLayout_5">
|
||||
<item row="0" column="0">
|
||||
<widget class="QCheckBox" name="checkBoxStartOnLogon">
|
||||
<item row="7" column="0">
|
||||
<widget class="QLabel" name="labelSettingsNote">
|
||||
<property name="text">
|
||||
<string>Start Bitmessage on user login</string>
|
||||
<string/>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="8" column="0">
|
||||
<spacer name="verticalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QCheckBox" name="checkBoxStartInTray">
|
||||
<property name="text">
|
||||
|
@ -51,6 +67,13 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QCheckBox" name="checkBoxShowTrayNotifications">
|
||||
<property name="text">
|
||||
<string>Show notification when message received</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QCheckBox" name="checkBoxMinimizeToTray">
|
||||
<property name="text">
|
||||
|
@ -61,20 +84,6 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QCheckBox" name="checkBoxShowTrayNotifications">
|
||||
<property name="text">
|
||||
<string>Show notification when message received</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QCheckBox" name="checkBoxPortableMode">
|
||||
<property name="text">
|
||||
<string>Run in Portable Mode</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0">
|
||||
<widget class="QLabel" name="label_7">
|
||||
<property name="text">
|
||||
|
@ -85,28 +94,26 @@
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="0">
|
||||
<widget class="QLabel" name="labelSettingsNote">
|
||||
<item row="0" column="0">
|
||||
<widget class="QCheckBox" name="checkBoxStartOnLogon">
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
<string>Start Bitmessage on user login</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="7" column="0">
|
||||
<spacer name="verticalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
<item row="4" column="0">
|
||||
<widget class="QCheckBox" name="checkBoxPortableMode">
|
||||
<property name="text">
|
||||
<string>Run in Portable Mode</string>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="0">
|
||||
<widget class="QCheckBox" name="checkBoxWillinglySendToMobile">
|
||||
<property name="text">
|
||||
<string>Willingly include unencrypted destination address when sending to a mobile device</string>
|
||||
</property>
|
||||
</spacer>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
|
|
|
@ -9,6 +9,7 @@ import proofofwork
|
|||
import sys
|
||||
from class_addressGenerator import pointMult
|
||||
import tr
|
||||
from debug import logger
|
||||
|
||||
# This thread, of which there is only one, does the heavy lifting:
|
||||
# calculating POWs.
|
||||
|
@ -517,6 +518,15 @@ class singleWorker(threading.Thread):
|
|||
pubkeyPayload[readPosition:readPosition + 10])
|
||||
readPosition += streamNumberLength
|
||||
behaviorBitfield = pubkeyPayload[readPosition:readPosition + 4]
|
||||
# Mobile users may ask us to include their address's RIPE hash on a message
|
||||
# unencrypted. Before we actually do it the sending human must check a box
|
||||
# in the settings menu to allow it.
|
||||
if shared.isBitSetWithinBitfield(behaviorBitfield,30): # if receiver is a mobile device who expects that their address RIPE is included unencrypted on the front of the message..
|
||||
if not shared.safeConfigGetBoolean('bitmessagesettings','willinglysendtomobile'): # if we are Not willing to include the receiver's RIPE hash on the message..
|
||||
logger.info('The receiver is a mobile user but the sender (you) has not selected that you are willing to send to mobiles. Aborting send.')
|
||||
shared.UISignalQueue.put(('updateSentItemStatusByAckdata',(ackdata,tr.translateText("MainWindow",'Problem: Destination is a mobile device who requests that the destination be included in the message but this is disallowed in your settings. %1').arg(unicode(strftime(shared.config.get('bitmessagesettings', 'timeformat'),localtime(int(time.time()))),'utf-8')))))
|
||||
# if the human changes their setting and then sends another message or restarts their client, this one will send at that time.
|
||||
continue
|
||||
readPosition += 4 # to bypass the bitfield of behaviors
|
||||
# pubSigningKeyBase256 =
|
||||
# pubkeyPayload[readPosition:readPosition+64] #We don't use this
|
||||
|
@ -663,6 +673,10 @@ class singleWorker(threading.Thread):
|
|||
with shared.printLock:
|
||||
print 'Not bothering to generate ackdata because we are sending to a chan.'
|
||||
fullAckPayload = ''
|
||||
elif not shared.isBitSetWithinBitfield(behaviorBitfield,31):
|
||||
with shared.printLock:
|
||||
print 'Not bothering to generate ackdata because the receiver said that they won\'t relay it anyway.'
|
||||
fullAckPayload = ''
|
||||
else:
|
||||
fullAckPayload = self.generateFullAckMessage(
|
||||
ackdata, toStreamNumber, embeddedTime) # The fullAckPayload is a normal msg protocol message with the proof of work already completed that the receiver of this message can easily send out.
|
||||
|
|
|
@ -201,17 +201,17 @@ def decodeWalletImportFormat(WIFstring):
|
|||
fullString = arithmetic.changebase(WIFstring,58,256)
|
||||
privkey = fullString[:-4]
|
||||
if fullString[-4:] != hashlib.sha256(hashlib.sha256(privkey).digest()).digest()[:4]:
|
||||
logger.error('Major problem! When trying to decode one of your private keys, the checksum '
|
||||
'failed. Here is the PRIVATE key: %s\n' % str(WIFstring))
|
||||
logger.critical('Major problem! When trying to decode one of your private keys, the checksum '
|
||||
'failed. Here is the PRIVATE key: %s' % str(WIFstring))
|
||||
return ""
|
||||
else:
|
||||
#checksum passed
|
||||
if privkey[0] == '\x80':
|
||||
return privkey[1:]
|
||||
else:
|
||||
logger.error('Major problem! When trying to decode one of your private keys, the '
|
||||
logger.critical('Major problem! When trying to decode one of your private keys, the '
|
||||
'checksum passed but the key doesn\'t begin with hex 80. Here is the '
|
||||
'PRIVATE key: %s\n' % str(WIFstring))
|
||||
'PRIVATE key: %s' % str(WIFstring))
|
||||
return ""
|
||||
|
||||
|
||||
|
@ -367,6 +367,12 @@ def fixSensitiveFilePermissions(filename, hasEnabledKeys):
|
|||
except Exception, e:
|
||||
logger.exception('Keyfile permissions could not be fixed.')
|
||||
raise
|
||||
|
||||
def isBitSetWithinBitfield(fourByteString, n):
|
||||
# Uses MSB 0 bit numbering across 4 bytes of data
|
||||
n = 31 - n
|
||||
x, = unpack('>L', fourByteString)
|
||||
return x & 2**n != 0
|
||||
|
||||
Peer = collections.namedtuple('Peer', ['host', 'port'])
|
||||
|
||||
|
|
Reference in New Issue
Block a user