From 6dfecbe36121dd94b209ffed1f736e08f694598a Mon Sep 17 00:00:00 2001 From: Kashiko Koibumi Date: Mon, 13 May 2024 08:06:24 +0900 Subject: [PATCH 01/32] try to migrate to Python3 + PyQt6 --- src/bitmessageqt/__init__.py | 355 +++---- src/bitmessageqt/account.py | 2 +- src/bitmessageqt/address_dialogs.py | 17 +- src/bitmessageqt/addressvalidator.py | 6 +- src/bitmessageqt/bitmessage_icons_rc.py | 8 +- src/bitmessageqt/bitmessageui.diff | 119 +++ src/bitmessageqt/bitmessageui.py | 1180 +++++++++++------------ src/bitmessageqt/bitmessageui.py.orig | 732 ++++++++++++++ src/bitmessageqt/bitmessageui.ui | 8 +- src/bitmessageqt/blacklist.py | 43 +- src/bitmessageqt/dialogs.py | 26 +- src/bitmessageqt/foldertree.py | 102 +- src/bitmessageqt/messagecompose.py | 4 +- src/bitmessageqt/messageview.py | 8 +- src/bitmessageqt/migrationwizard.py | 14 +- src/bitmessageqt/networkstatus.py | 33 +- src/bitmessageqt/newchandialog.py | 10 +- src/bitmessageqt/retranslateui.py | 4 +- src/bitmessageqt/safehtmlparser.py | 5 +- src/bitmessageqt/settings.py | 8 +- src/bitmessageqt/settingsmixin.py | 10 +- src/bitmessageqt/statusbar.py | 4 +- src/bitmessageqt/support.py | 8 +- src/bitmessageqt/uisignaler.py | 25 +- src/bitmessageqt/utils.py | 8 +- src/bitmessageqt/widgets.py | 2 +- src/depends.py | 17 +- src/namecoin.py | 4 +- src/network/__init__.py | 2 +- src/network/addrthread.py | 4 +- src/network/advanceddispatcher.py | 2 +- src/network/announcethread.py | 6 +- src/network/bmproto.py | 8 +- src/network/connectionchooser.py | 2 +- src/network/connectionpool.py | 16 +- src/network/dandelion.py | 16 +- src/network/downloadthread.py | 8 +- src/network/invthread.py | 8 +- src/network/knownnodes.py | 8 +- src/network/networkthread.py | 4 +- src/network/objectracker.py | 4 +- src/network/proxy.py | 6 +- src/network/receivequeuethread.py | 8 +- src/network/socks4a.py | 2 +- src/network/socks5.py | 4 +- src/network/stats.py | 6 +- src/network/tcp.py | 10 +- src/network/tls.py | 2 +- src/network/udp.py | 6 +- src/network/uploadthread.py | 4 +- src/tr.py | 4 +- start.sh | 2 +- 52 files changed, 1817 insertions(+), 1087 deletions(-) create mode 100644 src/bitmessageqt/bitmessageui.diff create mode 100644 src/bitmessageqt/bitmessageui.py.orig diff --git a/src/bitmessageqt/__init__.py b/src/bitmessageqt/__init__.py index 40113b5ada..f7a60b3de9 100644 --- a/src/bitmessageqt/__init__.py +++ b/src/bitmessageqt/__init__.py @@ -15,45 +15,45 @@ from datetime import datetime, timedelta from sqlite3 import register_adapter -from PyQt4 import QtCore, QtGui -from PyQt4.QtNetwork import QLocalSocket, QLocalServer +from PyQt6 import QtCore, QtGui, QtWidgets +from PyQt6.QtNetwork import QLocalSocket, QLocalServer import shared import state from debug import logger from tr import _translate -from account import ( +from .account import ( accountClass, getSortedSubscriptions, BMAccount, GatewayAccount, MailchuckAccount, AccountColor) from addresses import decodeAddress, addBMIfNotPresent -from bitmessageui import Ui_MainWindow +from .bitmessageui import Ui_MainWindow from bmconfigparser import config import namecoin -from messageview import MessageView -from migrationwizard import Ui_MigrationWizard -from foldertree import ( +from .messageview import MessageView +from .migrationwizard import Ui_MigrationWizard +from .foldertree import ( AccountMixin, Ui_FolderWidget, Ui_AddressWidget, Ui_SubscriptionWidget, MessageList_AddressWidget, MessageList_SubjectWidget, Ui_AddressBookWidgetItemLabel, Ui_AddressBookWidgetItemAddress, MessageList_TimeWidget) -import settingsmixin -import support +import bitmessageqt.settingsmixin +import bitmessageqt.support from helper_sql import sqlQuery, sqlExecute, sqlExecuteChunked, sqlStoredProcedure import helper_addressbook import helper_search import l10n -from utils import str_broadcast_subscribers, avatarize -import dialogs +from .utils import str_broadcast_subscribers, avatarize +import bitmessageqt.dialogs from network.stats import pendingDownload, pendingUpload -from uisignaler import UISignaler +from .uisignaler import UISignaler import paths from proofofwork import getPowType import queues import shutdown -from statusbar import BMStatusBar -import sound +from .statusbar import BMStatusBar +import bitmessageqt.sound # This is needed for tray icon -import bitmessage_icons_rc # noqa:F401 pylint: disable=unused-import +import bitmessageqt.bitmessage_icons_rc # noqa:F401 pylint: disable=unused-import import helper_sent try: @@ -112,7 +112,7 @@ def change_translation(self, newlocale=None): translationpath = os.path.join( paths.codePath(), 'translations', 'bitmessage_' + newlocale) self.qmytranslator.load(translationpath) - QtGui.QApplication.installTranslator(self.qmytranslator) + QtWidgets.QApplication.installTranslator(self.qmytranslator) self.qsystranslator = QtCore.QTranslator() if paths.frozen: @@ -120,10 +120,10 @@ def change_translation(self, newlocale=None): paths.codePath(), 'translations', 'qt_' + newlocale) else: translationpath = os.path.join( - str(QtCore.QLibraryInfo.location( - QtCore.QLibraryInfo.TranslationsPath)), 'qt_' + newlocale) + str(QtCore.QLibraryInfo.path( + QtCore.QLibraryInfo.LibraryPath.TranslationsPath)), 'qt_' + newlocale) self.qsystranslator.load(translationpath) - QtGui.QApplication.installTranslator(self.qsystranslator) + QtWidgets.QApplication.installTranslator(self.qsystranslator) # TODO: move this block into l10n # FIXME: shouldn't newlocale be used here? @@ -148,50 +148,27 @@ def change_translation(self, newlocale=None): logger.error("Failed to set locale to %s", lang, exc_info=True) def init_file_menu(self): - QtCore.QObject.connect(self.ui.actionExit, QtCore.SIGNAL( - "triggered()"), self.quit) - QtCore.QObject.connect(self.ui.actionNetworkSwitch, QtCore.SIGNAL( - "triggered()"), self.network_switch) - QtCore.QObject.connect(self.ui.actionManageKeys, QtCore.SIGNAL( - "triggered()"), self.click_actionManageKeys) - QtCore.QObject.connect(self.ui.actionDeleteAllTrashedMessages, - QtCore.SIGNAL( - "triggered()"), - self.click_actionDeleteAllTrashedMessages) - QtCore.QObject.connect(self.ui.actionRegenerateDeterministicAddresses, - QtCore.SIGNAL( - "triggered()"), - self.click_actionRegenerateDeterministicAddresses) - QtCore.QObject.connect( - self.ui.pushButtonAddChan, - QtCore.SIGNAL("clicked()"), - self.click_actionJoinChan) # also used for creating chans. - QtCore.QObject.connect(self.ui.pushButtonNewAddress, QtCore.SIGNAL( - "clicked()"), self.click_NewAddressDialog) - QtCore.QObject.connect(self.ui.pushButtonAddAddressBook, QtCore.SIGNAL( - "clicked()"), self.click_pushButtonAddAddressBook) - QtCore.QObject.connect(self.ui.pushButtonAddSubscription, QtCore.SIGNAL( - "clicked()"), self.click_pushButtonAddSubscription) - QtCore.QObject.connect(self.ui.pushButtonTTL, QtCore.SIGNAL( - "clicked()"), self.click_pushButtonTTL) - QtCore.QObject.connect(self.ui.pushButtonClear, QtCore.SIGNAL( - "clicked()"), self.click_pushButtonClear) - QtCore.QObject.connect(self.ui.pushButtonSend, QtCore.SIGNAL( - "clicked()"), self.click_pushButtonSend) - QtCore.QObject.connect(self.ui.pushButtonFetchNamecoinID, QtCore.SIGNAL( - "clicked()"), self.click_pushButtonFetchNamecoinID) - QtCore.QObject.connect(self.ui.actionSettings, QtCore.SIGNAL( - "triggered()"), self.click_actionSettings) - QtCore.QObject.connect(self.ui.actionAbout, QtCore.SIGNAL( - "triggered()"), self.click_actionAbout) - QtCore.QObject.connect(self.ui.actionSupport, QtCore.SIGNAL( - "triggered()"), self.click_actionSupport) - QtCore.QObject.connect(self.ui.actionHelp, QtCore.SIGNAL( - "triggered()"), self.click_actionHelp) + self.ui.actionExit.triggered.connect(self.quit) + self.ui.actionNetworkSwitch.triggered.connect(self.network_switch) + self.ui.actionManageKeys.triggered.connect(self.click_actionManageKeys) + self.ui.actionDeleteAllTrashedMessages.triggered.connect(self.click_actionDeleteAllTrashedMessages) + self.ui.actionRegenerateDeterministicAddresses.triggered.connect(self.click_actionRegenerateDeterministicAddresses) + self.ui.pushButtonAddChan.clicked.connect(self.click_actionJoinChan) # also used for creating chans. + self.ui.pushButtonNewAddress.clicked.connect(self.click_NewAddressDialog) + self.ui.pushButtonAddAddressBook.clicked.connect(self.click_pushButtonAddAddressBook) + self.ui.pushButtonAddSubscription.clicked.connect(self.click_pushButtonAddSubscription) + self.ui.pushButtonTTL.clicked.connect(self.click_pushButtonTTL) + self.ui.pushButtonClear.clicked.connect(self.click_pushButtonClear) + self.ui.pushButtonSend.clicked.connect(self.click_pushButtonSend) + self.ui.pushButtonFetchNamecoinID.clicked.connect(self.click_pushButtonFetchNamecoinID) + self.ui.actionSettings.triggered.connect(self.click_actionSettings) + self.ui.actionAbout.triggered.connect(self.click_actionAbout) + self.ui.actionSupport.triggered.connect(self.click_actionSupport) + self.ui.actionHelp.triggered.connect(self.click_actionHelp) def init_inbox_popup_menu(self, connectSignal=True): # Popup menu for the Inbox tab - self.ui.inboxContextMenuToolbar = QtGui.QToolBar() + self.ui.inboxContextMenuToolbar = QtWidgets.QToolBar() # Actions self.actionReply = self.ui.inboxContextMenuToolbar.addAction(_translate( "MainWindow", "Reply to sender"), self.on_action_InboxReply) @@ -225,27 +202,21 @@ def init_inbox_popup_menu(self, connectSignal=True): # contextmenu messagelists self.ui.tableWidgetInbox.setContextMenuPolicy( - QtCore.Qt.CustomContextMenu) + QtCore.Qt.ContextMenuPolicy.CustomContextMenu) if connectSignal: - self.connect(self.ui.tableWidgetInbox, QtCore.SIGNAL( - 'customContextMenuRequested(const QPoint&)'), - self.on_context_menuInbox) + self.ui.tableWidgetInbox.customContextMenuRequested.connect(self.on_context_menuInbox) self.ui.tableWidgetInboxSubscriptions.setContextMenuPolicy( - QtCore.Qt.CustomContextMenu) + QtCore.Qt.ContextMenuPolicy.CustomContextMenu) if connectSignal: - self.connect(self.ui.tableWidgetInboxSubscriptions, QtCore.SIGNAL( - 'customContextMenuRequested(const QPoint&)'), - self.on_context_menuInbox) + self.ui.tableWidgetInboxSubscriptions.customContextMenuRequested.connect(self.on_context_menuInbox) self.ui.tableWidgetInboxChans.setContextMenuPolicy( - QtCore.Qt.CustomContextMenu) + QtCore.Qt.ContextMenuPolicy.CustomContextMenu) if connectSignal: - self.connect(self.ui.tableWidgetInboxChans, QtCore.SIGNAL( - 'customContextMenuRequested(const QPoint&)'), - self.on_context_menuInbox) + self.ui.tableWidgetInboxChans.customContextMenuRequested.connect(self.on_context_menuInbox) def init_identities_popup_menu(self, connectSignal=True): # Popup menu for the Your Identities tab - self.ui.addressContextMenuToolbarYourIdentities = QtGui.QToolBar() + self.ui.addressContextMenuToolbarYourIdentities = QtWidgets.QToolBar() # Actions self.actionNewYourIdentities = self.ui.addressContextMenuToolbarYourIdentities.addAction(_translate( "MainWindow", "New"), self.on_action_YourIdentitiesNew) @@ -277,11 +248,9 @@ def init_identities_popup_menu(self, connectSignal=True): self.on_action_MarkAllRead) self.ui.treeWidgetYourIdentities.setContextMenuPolicy( - QtCore.Qt.CustomContextMenu) + QtCore.Qt.ContextMenuPolicy.CustomContextMenu) if connectSignal: - self.connect(self.ui.treeWidgetYourIdentities, QtCore.SIGNAL( - 'customContextMenuRequested(const QPoint&)'), - self.on_context_menuYourIdentities) + self.ui.treeWidgetYourIdentities.customContextMenuRequested.connect(self.on_context_menuYourIdentities) # load all gui.menu plugins with prefix 'address' self.menu_plugins = {'address': []} @@ -327,15 +296,13 @@ def init_chan_popup_menu(self, connectSignal=True): self.on_action_SpecialAddressBehaviorDialog) self.ui.treeWidgetChans.setContextMenuPolicy( - QtCore.Qt.CustomContextMenu) + QtCore.Qt.ContextMenuPolicy.CustomContextMenu) if connectSignal: - self.connect(self.ui.treeWidgetChans, QtCore.SIGNAL( - 'customContextMenuRequested(const QPoint&)'), - self.on_context_menuChan) + self.ui.treeWidgetChans.customContextMenuRequested.connect(self.on_context_menuChan) def init_addressbook_popup_menu(self, connectSignal=True): # Popup menu for the Address Book page - self.ui.addressBookContextMenuToolbar = QtGui.QToolBar() + self.ui.addressBookContextMenuToolbar = QtWidgets.QToolBar() # Actions self.actionAddressBookSend = self.ui.addressBookContextMenuToolbar.addAction( _translate( @@ -364,11 +331,9 @@ def init_addressbook_popup_menu(self, connectSignal=True): _translate( "MainWindow", "Delete"), self.on_action_AddressBookDelete) self.ui.tableWidgetAddressBook.setContextMenuPolicy( - QtCore.Qt.CustomContextMenu) + QtCore.Qt.ContextMenuPolicy.CustomContextMenu) if connectSignal: - self.connect(self.ui.tableWidgetAddressBook, QtCore.SIGNAL( - 'customContextMenuRequested(const QPoint&)'), - self.on_context_menuAddressBook) + self.ui.tableWidgetAddressBook.customContextMenuRequested.connect(self.on_context_menuAddressBook) def init_subscriptions_popup_menu(self, connectSignal=True): # Actions @@ -393,11 +358,9 @@ def init_subscriptions_popup_menu(self, connectSignal=True): _translate("MainWindow", "Send message to this address"), self.on_action_Send) self.ui.treeWidgetSubscriptions.setContextMenuPolicy( - QtCore.Qt.CustomContextMenu) + QtCore.Qt.ContextMenuPolicy.CustomContextMenu) if connectSignal: - self.connect(self.ui.treeWidgetSubscriptions, QtCore.SIGNAL( - 'customContextMenuRequested(const QPoint&)'), - self.on_context_menuSubscriptions) + self.ui.treeWidgetSubscriptions.customContextMenuRequested.connect(self.on_context_menuSubscriptions) def init_sent_popup_menu(self, connectSignal=True): # Actions @@ -421,12 +384,12 @@ def init_sent_popup_menu(self, connectSignal=True): def rerenderTabTreeSubscriptions(self): treeWidget = self.ui.treeWidgetSubscriptions folders = Ui_FolderWidget.folderWeight.keys() - folders.remove("new") + Ui_FolderWidget.folderWeight.pop("new", None) # sort ascending when creating if treeWidget.topLevelItemCount() == 0: treeWidget.header().setSortIndicator( - 0, QtCore.Qt.AscendingOrder) + 0, QtCore.Qt.SortOrder.AscendingOrder) # init dictionary db = getSortedSubscriptions(True) @@ -468,7 +431,7 @@ def rerenderTabTreeSubscriptions(self): # add missing folders if len(db[toAddress]) > 0: j = 0 - for f, c in db[toAddress].iteritems(): + for f, c in db[toAddress].items(): try: subwidget = Ui_FolderWidget(widget, j, toAddress, f, c['count']) except KeyError: @@ -517,7 +480,7 @@ def rerenderTabTree(self, tab): # sort ascending when creating if treeWidget.topLevelItemCount() == 0: treeWidget.header().setSortIndicator( - 0, QtCore.Qt.AscendingOrder) + 0, QtCore.Qt.SortOrder.AscendingOrder) # init dictionary db = {} enabled = {} @@ -598,7 +561,7 @@ def rerenderTabTree(self, tab): # add missing folders if len(db[toAddress]) > 0: j = 0 - for f, c in db[toAddress].iteritems(): + for f, c in db[toAddress].items(): if toAddress is not None and tab == 'messages' and folder == "new": continue subwidget = Ui_FolderWidget(widget, j, toAddress, f, c) @@ -627,7 +590,7 @@ def rerenderTabTree(self, tab): treeWidget.setSortingEnabled(True) def __init__(self, parent=None): - QtGui.QWidget.__init__(self, parent) + QtWidgets.QWidget.__init__(self, parent) self.ui = Ui_MainWindow() self.ui.setupUi(self) @@ -695,65 +658,44 @@ def __init__(self, parent=None): self.rerenderSubscriptions() # Initialize the inbox search - QtCore.QObject.connect(self.ui.inboxSearchLineEdit, QtCore.SIGNAL( - "returnPressed()"), self.inboxSearchLineEditReturnPressed) - QtCore.QObject.connect(self.ui.inboxSearchLineEditSubscriptions, QtCore.SIGNAL( - "returnPressed()"), self.inboxSearchLineEditReturnPressed) - QtCore.QObject.connect(self.ui.inboxSearchLineEditChans, QtCore.SIGNAL( - "returnPressed()"), self.inboxSearchLineEditReturnPressed) - QtCore.QObject.connect(self.ui.inboxSearchLineEdit, QtCore.SIGNAL( - "textChanged(QString)"), self.inboxSearchLineEditUpdated) - QtCore.QObject.connect(self.ui.inboxSearchLineEditSubscriptions, QtCore.SIGNAL( - "textChanged(QString)"), self.inboxSearchLineEditUpdated) - QtCore.QObject.connect(self.ui.inboxSearchLineEditChans, QtCore.SIGNAL( - "textChanged(QString)"), self.inboxSearchLineEditUpdated) + self.ui.inboxSearchLineEdit.returnPressed.connect(self.inboxSearchLineEditReturnPressed) + self.ui.inboxSearchLineEditSubscriptions.returnPressed.connect(self.inboxSearchLineEditReturnPressed) + self.ui.inboxSearchLineEditChans.returnPressed.connect(self.inboxSearchLineEditReturnPressed) + self.ui.inboxSearchLineEdit.textChanged.connect(self.inboxSearchLineEditUpdated) + self.ui.inboxSearchLineEditSubscriptions.textChanged.connect(self.inboxSearchLineEditUpdated) + self.ui.inboxSearchLineEditChans.textChanged.connect(self.inboxSearchLineEditUpdated) # Initialize addressbook - QtCore.QObject.connect(self.ui.tableWidgetAddressBook, QtCore.SIGNAL( - "itemChanged(QTableWidgetItem *)"), self.tableWidgetAddressBookItemChanged) + self.ui.tableWidgetAddressBook.itemChanged.connect(self.tableWidgetAddressBookItemChanged) # This is necessary for the completer to work if multiple recipients - QtCore.QObject.connect(self.ui.lineEditTo, QtCore.SIGNAL( - "cursorPositionChanged(int, int)"), self.ui.lineEditTo.completer().onCursorPositionChanged) + self.ui.lineEditTo.cursorPositionChanged.connect(self.ui.lineEditTo.completer().onCursorPositionChanged) # show messages from message list - QtCore.QObject.connect(self.ui.tableWidgetInbox, QtCore.SIGNAL( - "itemSelectionChanged ()"), self.tableWidgetInboxItemClicked) - QtCore.QObject.connect(self.ui.tableWidgetInboxSubscriptions, QtCore.SIGNAL( - "itemSelectionChanged ()"), self.tableWidgetInboxItemClicked) - QtCore.QObject.connect(self.ui.tableWidgetInboxChans, QtCore.SIGNAL( - "itemSelectionChanged ()"), self.tableWidgetInboxItemClicked) + self.ui.tableWidgetInbox.itemSelectionChanged.connect(self.tableWidgetInboxItemClicked) + self.ui.tableWidgetInboxSubscriptions.itemSelectionChanged.connect(self.tableWidgetInboxItemClicked) + self.ui.tableWidgetInboxChans.itemSelectionChanged.connect(self.tableWidgetInboxItemClicked) # tree address lists - QtCore.QObject.connect(self.ui.treeWidgetYourIdentities, QtCore.SIGNAL( - "itemSelectionChanged ()"), self.treeWidgetItemClicked) - QtCore.QObject.connect(self.ui.treeWidgetYourIdentities, QtCore.SIGNAL( - "itemChanged (QTreeWidgetItem *, int)"), self.treeWidgetItemChanged) - QtCore.QObject.connect(self.ui.treeWidgetSubscriptions, QtCore.SIGNAL( - "itemSelectionChanged ()"), self.treeWidgetItemClicked) - QtCore.QObject.connect(self.ui.treeWidgetSubscriptions, QtCore.SIGNAL( - "itemChanged (QTreeWidgetItem *, int)"), self.treeWidgetItemChanged) - QtCore.QObject.connect(self.ui.treeWidgetChans, QtCore.SIGNAL( - "itemSelectionChanged ()"), self.treeWidgetItemClicked) - QtCore.QObject.connect(self.ui.treeWidgetChans, QtCore.SIGNAL( - "itemChanged (QTreeWidgetItem *, int)"), self.treeWidgetItemChanged) - QtCore.QObject.connect( - self.ui.tabWidget, QtCore.SIGNAL("currentChanged(int)"), - self.tabWidgetCurrentChanged - ) + self.ui.treeWidgetYourIdentities.itemSelectionChanged.connect(self.treeWidgetItemClicked) + self.ui.treeWidgetYourIdentities.itemChanged.connect(self.treeWidgetItemChanged) + self.ui.treeWidgetSubscriptions.itemSelectionChanged.connect(self.treeWidgetItemClicked) + self.ui.treeWidgetSubscriptions.itemChanged.connect(self.treeWidgetItemChanged) + self.ui.treeWidgetChans.itemSelectionChanged.connect(self.treeWidgetItemClicked) + self.ui.treeWidgetChans.itemChanged.connect(self.treeWidgetItemChanged) + self.ui.tabWidget.currentChanged.connect(self.tabWidgetCurrentChanged) # Put the colored icon on the status bar # self.pushButtonStatusIcon.setIcon(QIcon(":/newPrefix/images/yellowicon.png")) self.setStatusBar(BMStatusBar()) self.statusbar = self.statusBar() - self.pushButtonStatusIcon = QtGui.QPushButton(self) + self.pushButtonStatusIcon = QtWidgets.QPushButton(self) self.pushButtonStatusIcon.setText('') self.pushButtonStatusIcon.setIcon( QtGui.QIcon(':/newPrefix/images/redicon.png')) self.pushButtonStatusIcon.setFlat(True) self.statusbar.insertPermanentWidget(0, self.pushButtonStatusIcon) - QtCore.QObject.connect(self.pushButtonStatusIcon, QtCore.SIGNAL( - "clicked()"), self.click_pushButtonStatusIcon) + self.pushButtonStatusIcon.clicked.connect(self.click_pushButtonStatusIcon) self.unreadCount = 0 @@ -767,39 +709,21 @@ def __init__(self, parent=None): self.UISignalThread = UISignaler.get() - QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL( - "writeNewAddressToTable(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject)"), self.writeNewAddressToTable) - QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL( - "updateStatusBar(PyQt_PyObject)"), self.updateStatusBar) - QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL( - "updateSentItemStatusByToAddress(PyQt_PyObject,PyQt_PyObject)"), self.updateSentItemStatusByToAddress) - QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL( - "updateSentItemStatusByAckdata(PyQt_PyObject,PyQt_PyObject)"), self.updateSentItemStatusByAckdata) - QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL( - "displayNewInboxMessage(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject)"), - self.displayNewInboxMessage) - QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL( - "displayNewSentMessage(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject," - "PyQt_PyObject,PyQt_PyObject)"), - self.displayNewSentMessage) - QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL( - "setStatusIcon(PyQt_PyObject)"), self.setStatusIcon) - QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL( - "changedInboxUnread(PyQt_PyObject)"), self.changedInboxUnread) - QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL( - "rerenderMessagelistFromLabels()"), self.rerenderMessagelistFromLabels) - QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL( - "rerenderMessgelistToLabels()"), self.rerenderMessagelistToLabels) - QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL( - "rerenderAddressBook()"), self.rerenderAddressBook) - QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL( - "rerenderSubscriptions()"), self.rerenderSubscriptions) - QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL( - "removeInboxRowByMsgid(PyQt_PyObject)"), self.removeInboxRowByMsgid) - QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL( - "newVersionAvailable(PyQt_PyObject)"), self.newVersionAvailable) - QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL( - "displayAlert(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject)"), self.displayAlert) + self.UISignalThread.writeNewAddressToTable.connect(self.writeNewAddressToTable) + self.UISignalThread.updateStatusBar.connect(self.updateStatusBar) + self.UISignalThread.updateSentItemStatusByToAddress.connect(self.updateSentItemStatusByToAddress) + self.UISignalThread.updateSentItemStatusByAckdata.connect(self.updateSentItemStatusByAckdata) + self.UISignalThread.displayNewInboxMessage.connect(self.displayNewInboxMessage) + self.UISignalThread.displayNewSentMessage.connect(self.displayNewSentMessage) + self.UISignalThread.setStatusIcon.connect(self.setStatusIcon) + self.UISignalThread.changedInboxUnread.connect(self.changedInboxUnread) + self.UISignalThread.rerenderMessagelistFromLabels.connect(self.rerenderMessagelistFromLabels) + self.UISignalThread.rerenderMessagelistToLabels.connect(self.rerenderMessagelistToLabels) + self.UISignalThread.rerenderAddressBook.connect(self.rerenderAddressBook) + self.UISignalThread.rerenderSubscriptions.connect(self.rerenderSubscriptions) + self.UISignalThread.removeInboxRowByMsgid.connect(self.removeInboxRowByMsgid) + self.UISignalThread.newVersionAvailable.connect(self.newVersionAvailable) + self.UISignalThread.displayAlert.connect(self.displayAlert) self.UISignalThread.start() # Key press in tree view @@ -832,11 +756,10 @@ def __init__(self, parent=None): TTL = 3600 elif TTL > 28*24*60*60: # 28 days TTL = 28*24*60*60 - self.ui.horizontalSliderTTL.setSliderPosition((TTL - 3600) ** (1/3.199)) + self.ui.horizontalSliderTTL.setSliderPosition(int((TTL - 3600) ** (1/3.199))) self.updateHumanFriendlyTTLDescription(TTL) - QtCore.QObject.connect(self.ui.horizontalSliderTTL, QtCore.SIGNAL( - "valueChanged(int)"), self.updateTTL) + self.ui.horizontalSliderTTL.valueChanged.connect(self.updateTTL) self.initSettings() self.resetNamecoinConnection() @@ -898,9 +821,9 @@ def updateHumanFriendlyTTLDescription(self, TTL): if numberOfHours < 48: self.ui.labelHumanFriendlyTTLDescription.setText( - _translate("MainWindow", "%n hour(s)", None, QtCore.QCoreApplication.CodecForTr, numberOfHours) + + _translate("MainWindow", "%n hour(s)", None, numberOfHours) + ", " + - _translate("MainWindow", "not recommended for chans", None, QtCore.QCoreApplication.CodecForTr) + _translate("MainWindow", "not recommended for chans", None) ) stylesheet = "QLabel { color : red; }" font.setBold(True) @@ -911,7 +834,6 @@ def updateHumanFriendlyTTLDescription(self, TTL): "MainWindow", "%n day(s)", None, - QtCore.QCoreApplication.CodecForTr, numberOfDays)) font.setBold(False) self.ui.labelHumanFriendlyTTLDescription.setStyleSheet(stylesheet) @@ -1186,11 +1108,11 @@ def addMessageListItemSent( items = [ MessageList_AddressWidget( - toAddress, unicode(acct.toLabel, 'utf-8')), + toAddress, str(acct.toLabel, 'utf-8')), MessageList_AddressWidget( - fromAddress, unicode(acct.fromLabel, 'utf-8')), + fromAddress, str(acct.fromLabel, 'utf-8')), MessageList_SubjectWidget( - str(subject), unicode(acct.subject, 'utf-8', 'replace')), + str(subject), str(acct.subject, 'utf-8', 'replace')), MessageList_TimeWidget( statusText, False, lastactiontime, ackdata)] self.addMessageListItem(tableWidget, items) @@ -1211,11 +1133,11 @@ def addMessageListItemInbox( items = [ MessageList_AddressWidget( - toAddress, unicode(acct.toLabel, 'utf-8'), not read), + toAddress, str(acct.toLabel, 'utf-8'), not read), MessageList_AddressWidget( - fromAddress, unicode(acct.fromLabel, 'utf-8'), not read), + fromAddress, str(acct.fromLabel, 'utf-8'), not read), MessageList_SubjectWidget( - str(subject), unicode(acct.subject, 'utf-8', 'replace'), + str(subject), str(acct.subject, 'utf-8', 'replace'), not read), MessageList_TimeWidget( l10n.formatTimestamp(received), not read, received, msgid) @@ -1299,11 +1221,9 @@ def loadMessagelist( # create application indicator def appIndicatorInit(self, app): self.initTrayIcon("can-icon-24px-red.png", app) - traySignal = "activated(QSystemTrayIcon::ActivationReason)" - QtCore.QObject.connect(self.tray, QtCore.SIGNAL( - traySignal), self.__icon_activated) + self.tray.activated.connect(self.__icon_activated); - m = QtGui.QMenu() + m = QtWidgets.QMenu() self.actionStatus = QtGui.QAction(_translate( "MainWindow", "Not Connected"), m, checkable=False) @@ -1471,7 +1391,8 @@ def _simple_notify( self._notifier = _simple_notify # does nothing if isAvailable returns false - self._player = QtGui.QSound.play + # XXX unresolved + #self._player = QtGui.QSound.play if not get_plugins: return @@ -1484,7 +1405,9 @@ def _simple_notify( self._theme_player = get_plugin('notification.sound', 'theme') - if not QtGui.QSound.isAvailable(): + # XXX unresolved + #if not QtGui.QSound.isAvailable(): + if not False: _plugin = get_plugin( 'notification.sound', 'file', fallback='file.fallback') if _plugin: @@ -1496,7 +1419,7 @@ def notifierShow( self, title, subtitle, category, label=None, icon=None): self.playSound(category, label) self._notifier( - unicode(title), unicode(subtitle), category, label, icon) + str(title), str(subtitle), category, label, icon) # tree def treeWidgetKeyPressEvent(self, event): @@ -1712,7 +1635,7 @@ def click_actionJoinChan(self): def showConnectDialog(self): dialog = dialogs.ConnectDialog(self) - if dialog.exec_(): + if dialog.exec(): if dialog.radioButtonConnectNow.isChecked(): self.ui.updateNetworkSwitchMenuLabel(False) config.remove_option( @@ -1820,7 +1743,7 @@ def setStatusIcon(self, color): def initTrayIcon(self, iconFileName, app): self.currentTrayIconFileName = iconFileName - self.tray = QtGui.QSystemTrayIcon( + self.tray = QtWidgets.QSystemTrayIcon( self.calcTrayIcon(iconFileName, self.findInboxUnreadCount()), app) def setTrayIconFile(self, iconFileName): @@ -1995,9 +1918,9 @@ def rerenderMessagelistToLabels(self): def rerenderAddressBook(self): def addRow (address, label, type): self.ui.tableWidgetAddressBook.insertRow(0) - newItem = Ui_AddressBookWidgetItemLabel(address, unicode(label, 'utf-8'), type) + newItem = Ui_AddressBookWidgetItemLabel(address, label, type) self.ui.tableWidgetAddressBook.setItem(0, 0, newItem) - newItem = Ui_AddressBookWidgetItemAddress(address, unicode(label, 'utf-8'), type) + newItem = Ui_AddressBookWidgetItemAddress(address, label, type) self.ui.tableWidgetAddressBook.setItem(0, 1, newItem) oldRows = {} @@ -2006,7 +1929,7 @@ def addRow (address, label, type): oldRows[item.address] = [item.label, item.type, i] if self.ui.tableWidgetAddressBook.rowCount() == 0: - self.ui.tableWidgetAddressBook.horizontalHeader().setSortIndicator(0, QtCore.Qt.AscendingOrder) + self.ui.tableWidgetAddressBook.horizontalHeader().setSortIndicator(0, QtCore.Qt.SortOrder.AscendingOrder) if self.ui.tableWidgetAddressBook.isSortingEnabled(): self.ui.tableWidgetAddressBook.setSortingEnabled(False) @@ -2038,11 +1961,11 @@ def addRow (address, label, type): self.ui.tableWidgetAddressBook.removeRow(oldRows[address][2]) for address in newRows: addRow(address, newRows[address][0], newRows[address][1]) - completerList.append(unicode(newRows[address][0], encoding="UTF-8") + " <" + address + ">") + completerList.append(newRows[address][0] + " <" + address + ">") # sort self.ui.tableWidgetAddressBook.sortByColumn( - 0, QtCore.Qt.AscendingOrder) + 0, QtCore.Qt.SortOrder.AscendingOrder) self.ui.tableWidgetAddressBook.setSortingEnabled(True) self.ui.lineEditTo.completer().model().setStringList(completerList) @@ -2164,7 +2087,7 @@ def click_pushButtonSend(self): status, addressVersionNumber, streamNumber = decodeAddress(toAddress)[:3] if status != 'success': try: - toAddress = unicode(toAddress, 'utf-8', 'ignore') + toAddress = str(toAddress, 'utf-8', 'ignore') except: pass logger.error('Error: Could not decode recipient address ' + toAddress + ':' + status) @@ -2368,11 +2291,11 @@ def rerenderComboBoxSendFrom(self): addressInKeysFile, 'enabled') isMaillinglist = config.safeGetBoolean(addressInKeysFile, 'mailinglist') if isEnabled and not isMaillinglist: - label = unicode(config.get(addressInKeysFile, 'label'), 'utf-8', 'ignore').strip() + label = str(config.get(addressInKeysFile, 'label'), 'utf-8', 'ignore').strip() if label == "": label = addressInKeysFile self.ui.comboBoxSendFrom.addItem(avatarize(addressInKeysFile), label, addressInKeysFile) -# self.ui.comboBoxSendFrom.model().sort(1, Qt.AscendingOrder) +# self.ui.comboBoxSendFrom.model().sort(1, QtCore.Qt.SortOrder.AscendingOrder) for i in range(self.ui.comboBoxSendFrom.count()): address = str(self.ui.comboBoxSendFrom.itemData( i, QtCore.Qt.UserRole).toString()) @@ -2392,7 +2315,7 @@ def rerenderComboBoxSendFromBroadcast(self): addressInKeysFile, 'enabled') isChan = config.safeGetBoolean(addressInKeysFile, 'chan') if isEnabled and not isChan: - label = unicode(config.get(addressInKeysFile, 'label'), 'utf-8', 'ignore').strip() + label = str(config.get(addressInKeysFile, 'label'), 'utf-8', 'ignore').strip() if label == "": label = addressInKeysFile self.ui.comboBoxSendFromBroadcast.addItem(avatarize(addressInKeysFile), label, addressInKeysFile) @@ -2498,7 +2421,7 @@ def displayNewInboxMessage( self.notifierShow( _translate("MainWindow", "New Message"), _translate("MainWindow", "From %1").arg( - unicode(acct.fromLabel, 'utf-8')), + str(acct.fromLabel, 'utf-8')), sound.SOUND_UNKNOWN ) if self.getCurrentAccount() is not None and ( @@ -2732,12 +2655,12 @@ def quit(self): _translate( "MainWindow", "%n object(s) pending proof of work", None, - QtCore.QCoreApplication.CodecForTr, powQueueSize() + powQueueSize() ) + ", " + _translate( "MainWindow", "%n object(s) waiting to be distributed", None, - QtCore.QCoreApplication.CodecForTr, pendingUpload() + pendingUpload() ) + "\n\n" + _translate( "MainWindow", "Wait until these tasks finish?"), @@ -2871,7 +2794,7 @@ def quit(self): QtCore.QEventLoop.AllEvents, 1000 ) self.saveSettings() - for attr, obj in self.ui.__dict__.iteritems(): + for attr, obj in self.ui.__dict__.items(): if hasattr(obj, "__class__") \ and isinstance(obj, settingsmixin.SettingsMixin): saveMethod = getattr(obj, "saveSettings", None) @@ -2934,7 +2857,7 @@ def on_action_InboxMessageForceHtml(self): lines[i] = '

' content = ' '.join(lines) # To keep the whitespace between lines content = shared.fixPotentiallyInvalidUTF8Data(content) - content = unicode(content, 'utf-8)') + content = str(content, 'utf-8)') textEdit.setHtml(QtCore.QString(content)) def on_action_InboxMarkUnread(self): @@ -3117,7 +3040,7 @@ def on_action_InboxReply(self, reply_type=None): self.setSendFromComboBox(toAddressAtCurrentInboxRow) quotedText = self.quoted_text( - unicode(messageAtCurrentInboxRow, 'utf-8', 'replace')) + str(messageAtCurrentInboxRow, 'utf-8', 'replace')) widget['message'].setPlainText(quotedText) if acct.subject[0:3] in ('Re:', 'RE:'): widget['subject'].setText( @@ -3368,7 +3291,7 @@ def on_action_AddressBookSend(self): return self.updateStatusBar(_translate( "MainWindow", "No addresses selected.")) - addresses_string = unicode( + addresses_string = str( self.ui.lineEditTo.text().toUtf8(), 'utf-8') for item in selected_items: address_string = item.accountString() @@ -3861,11 +3784,11 @@ def on_action_AddressBookSetSound(self): self.setAddressSound(widget.item(widget.currentRow(), 0).text()) def setAddressSound(self, addr): - filters = [unicode(_translate( + filters = [str(_translate( "MainWindow", "Sound files (%s)" % ' '.join(['*%s%s' % (os.extsep, ext) for ext in sound.extensions]) ))] - sourcefile = unicode(QtGui.QFileDialog.getOpenFileName( + sourcefile = str(QtGui.QFileDialog.getOpenFileName( self, _translate("MainWindow", "Set notification sound..."), filter=';;'.join(filters) )) @@ -3874,7 +3797,7 @@ def setAddressSound(self, addr): return destdir = os.path.join(state.appdata, 'sounds') - destfile = unicode(addr) + os.path.splitext(sourcefile)[-1] + destfile = str(addr) + os.path.splitext(sourcefile)[-1] destination = os.path.join(destdir, destfile) if sourcefile == destination: @@ -4084,7 +4007,7 @@ def treeWidgetItemChanged(self, item, column): if item.type == AccountMixin.ALL: return - newLabel = unicode(item.text(0), 'utf-8', 'ignore') + newLabel = str(item.text(0), 'utf-8', 'ignore') oldLabel = item.defaultLabel() # unchanged, do not do anything either @@ -4155,7 +4078,7 @@ def tableWidgetAddressBookItemChanged(self, item): self.rerenderMessagelistToLabels() completerList = self.ui.lineEditTo.completer().model().stringList() for i in range(len(completerList)): - if unicode(completerList[i]).endswith(" <" + item.address + ">"): + if str(completerList[i]).endswith(" <" + item.address + ">"): completerList[i] = item.label + " <" + item.address + ">" self.ui.lineEditTo.completer().model().setStringList(completerList) @@ -4209,7 +4132,7 @@ def resetNamecoinConnection(self): def initSettings(self): self.loadSettings() - for attr, obj in self.ui.__dict__.iteritems(): + for attr, obj in self.ui.__dict__.items(): if hasattr(obj, "__class__") and \ isinstance(obj, settingsmixin.SettingsMixin): loadMethod = getattr(obj, "loadSettings", None) @@ -4221,7 +4144,7 @@ def initSettings(self): myapp = None -class BitmessageQtApplication(QtGui.QApplication): +class BitmessageQtApplication(QtWidgets.QApplication): """ Listener to allow our Qt form to get focus when another instance of the application is open. @@ -4250,7 +4173,7 @@ def __init__(self, *argv): # Cleanup past crashed servers if not self.is_running: - if socket.error() == QLocalSocket.ConnectionRefusedError: + if socket.error() == QLocalSocket.LocalSocketError.ConnectionRefusedError: socket.disconnectFromServer() QLocalServer.removeServer(id) @@ -4307,4 +4230,4 @@ def run(): QtCore.QTimer.singleShot( 30000, lambda: myapp.setStatusIcon(state.statusIconColor)) - app.exec_() + app.exec() diff --git a/src/bitmessageqt/account.py b/src/bitmessageqt/account.py index 8c82c6f64e..25c86e46d3 100644 --- a/src/bitmessageqt/account.py +++ b/src/bitmessageqt/account.py @@ -14,7 +14,7 @@ import sys import time -from PyQt4 import QtGui +from PyQt6 import QtGui import queues from addresses import decodeAddress diff --git a/src/bitmessageqt/address_dialogs.py b/src/bitmessageqt/address_dialogs.py index bf571041a6..bee2779489 100644 --- a/src/bitmessageqt/address_dialogs.py +++ b/src/bitmessageqt/address_dialogs.py @@ -5,12 +5,12 @@ import hashlib -from PyQt4 import QtCore, QtGui +from PyQt6 import QtCore, QtGui, QtWidgets import queues -import widgets +import bitmessageqt.widgets import state -from account import AccountMixin, GatewayAccount, MailchuckAccount, accountClass +from .account import AccountMixin, GatewayAccount, MailchuckAccount, accountClass from addresses import addBMIfNotPresent, decodeAddress, encodeVarint from bmconfigparser import config as global_config from tr import _translate @@ -79,7 +79,7 @@ def addressChanged(self, QString): )) -class AddressDataDialog(QtGui.QDialog, AddressCheckMixin): +class AddressDataDialog(QtWidgets.QDialog, AddressCheckMixin): """QDialog with Bitmessage address validation""" def __init__(self, parent): @@ -112,7 +112,7 @@ def __init__(self, parent=None, address=None): self.lineEditAddress.setText(address) -class NewAddressDialog(QtGui.QDialog): +class NewAddressDialog(QtWidgets.QDialog): """QDialog for generating a new address""" def __init__(self, parent=None): @@ -212,12 +212,11 @@ def _onSuccess(self, addressVersion, streamNumber, ripe): "MainWindow", "Display the %n recent broadcast(s) from this address.", None, - QtCore.QCoreApplication.CodecForTr, count )) -class RegenerateAddressesDialog(QtGui.QDialog): +class RegenerateAddressesDialog(QtWidgets.QDialog): """QDialog for regenerating deterministic addresses""" def __init__(self, parent=None): super(RegenerateAddressesDialog, self).__init__(parent) @@ -226,7 +225,7 @@ def __init__(self, parent=None): QtGui.QWidget.resize(self, QtGui.QWidget.sizeHint(self)) -class SpecialAddressBehaviorDialog(QtGui.QDialog): +class SpecialAddressBehaviorDialog(QtWidgets.QDialog): """ QDialog for special address behaviour (e.g. mailing list functionality) """ @@ -291,7 +290,7 @@ def accept(self): self.parent.rerenderMessagelistToLabels() -class EmailGatewayDialog(QtGui.QDialog): +class EmailGatewayDialog(QtWidgets.QDialog): """QDialog for email gateway control""" def __init__(self, parent, config=global_config, account=None): super(EmailGatewayDialog, self).__init__(parent) diff --git a/src/bitmessageqt/addressvalidator.py b/src/bitmessageqt/addressvalidator.py index dc61b41cde..d1485b7b58 100644 --- a/src/bitmessageqt/addressvalidator.py +++ b/src/bitmessageqt/addressvalidator.py @@ -3,15 +3,15 @@ """ # pylint: disable=too-many-branches,too-many-arguments -from Queue import Empty +from queue import Empty -from PyQt4 import QtGui +from PyQt6 import QtGui from addresses import decodeAddress, addBMIfNotPresent from bmconfigparser import config from queues import apiAddressGeneratorReturnQueue, addressGeneratorQueue from tr import _translate -from utils import str_chan +from .utils import str_chan class AddressPassPhraseValidatorMixin(object): diff --git a/src/bitmessageqt/bitmessage_icons_rc.py b/src/bitmessageqt/bitmessage_icons_rc.py index bb0a02c02c..a06fd964f3 100644 --- a/src/bitmessageqt/bitmessage_icons_rc.py +++ b/src/bitmessageqt/bitmessage_icons_rc.py @@ -7,9 +7,9 @@ # # WARNING! All changes made in this file will be lost! -from PyQt4 import QtCore +from PyQt6 import QtCore -qt_resource_data = "\ +qt_resource_data = b"\ \x00\x00\x03\x66\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ @@ -1534,7 +1534,7 @@ \x82\ " -qt_resource_name = "\ +qt_resource_name = b"\ \x00\x09\ \x0c\x78\x54\x88\ \x00\x6e\ @@ -1639,7 +1639,7 @@ \x00\x70\x00\x6e\x00\x67\ " -qt_resource_struct = "\ +qt_resource_struct = b"\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\ \x00\x00\x00\x18\x00\x02\x00\x00\x00\x15\x00\x00\x00\x03\ diff --git a/src/bitmessageqt/bitmessageui.diff b/src/bitmessageqt/bitmessageui.diff new file mode 100644 index 0000000000..7e42fa3ef9 --- /dev/null +++ b/src/bitmessageqt/bitmessageui.diff @@ -0,0 +1,119 @@ +--- bitmessageui.py.orig 2024-05-12 18:57:04.429581050 +0900 ++++ bitmessageui.py 2024-05-12 19:50:49.951776910 +0900 +@@ -7,7 +7,8 @@ + + + from PyQt6 import QtCore, QtGui, QtWidgets +- ++from bmconfigparser import config ++from .foldertree import AddressBookCompleter + + class Ui_MainWindow(object): + def setupUi(self, MainWindow): +@@ -137,6 +138,11 @@ + self.tableWidgetAddressBook.horizontalHeader().setStretchLastSection(True) + self.tableWidgetAddressBook.verticalHeader().setVisible(False) + self.verticalLayout_2.addWidget(self.tableWidgetAddressBook) ++ self.addressBookCompleter = AddressBookCompleter() ++ self.addressBookCompleter.setCompletionMode(QtWidgets.QCompleter.CompletionMode.PopupCompletion) ++ self.addressBookCompleter.setCaseSensitivity(QtCore.Qt.CaseSensitivity.CaseInsensitive) ++ self.addressBookCompleterModel = QtCore.QStringListModel() ++ self.addressBookCompleter.setModel(self.addressBookCompleterModel) + self.pushButtonAddAddressBook = QtWidgets.QPushButton(parent=self.send) + self.pushButtonAddAddressBook.setMaximumSize(QtCore.QSize(200, 16777215)) + self.pushButtonAddAddressBook.setObjectName("pushButtonAddAddressBook") +@@ -181,6 +187,7 @@ + self.lineEditTo = QtWidgets.QLineEdit(parent=self.tab) + self.lineEditTo.setObjectName("lineEditTo") + self.gridLayout_2.addWidget(self.lineEditTo, 1, 1, 1, 1) ++ self.lineEditTo.setCompleter(self.addressBookCompleter) + self.verticalLayout_5.addLayout(self.gridLayout_2) + self.textEditMessage = QtWidgets.QTextEdit(parent=self.tab) + self.textEditMessage.setObjectName("textEditMessage") +@@ -260,6 +267,9 @@ + self.labelHumanFriendlyTTLDescription.setMaximumSize(QtCore.QSize(45, 16777215)) + self.labelHumanFriendlyTTLDescription.setObjectName("labelHumanFriendlyTTLDescription") + self.horizontalLayout_5.addWidget(self.labelHumanFriendlyTTLDescription) ++ self.pushButtonClear = QtWidgets.QPushButton(parent=self.send) ++ self.pushButtonClear.setObjectName("pushButtonClear") ++ self.horizontalLayout_5.addWidget(self.pushButtonClear, 0, QtCore.Qt.AlignmentFlag.AlignRight) + self.pushButtonSend = QtWidgets.QPushButton(parent=self.send) + self.pushButtonSend.setMaximumSize(QtCore.QSize(16777215, 16777215)) + self.pushButtonSend.setObjectName("pushButtonSend") +@@ -546,6 +556,8 @@ + self.actionManageKeys = QtGui.QAction(parent=MainWindow) + self.actionManageKeys.setCheckable(False) + self.actionManageKeys.setEnabled(True) ++ self.actionNetworkSwitch = QtGui.QAction(parent=MainWindow) ++ self.actionNetworkSwitch.setObjectName("actionNetworkSwitch") + icon = QtGui.QIcon.fromTheme("dialog-password") + self.actionManageKeys.setIcon(icon) + self.actionManageKeys.setObjectName("actionManageKeys") +@@ -557,6 +569,10 @@ + icon = QtGui.QIcon.fromTheme("help-contents") + self.actionHelp.setIcon(icon) + self.actionHelp.setObjectName("actionHelp") ++ self.actionSupport = QtGui.QAction(MainWindow) ++ icon = QtGui.QIcon.fromTheme("help-support") ++ self.actionSupport.setIcon(icon) ++ self.actionSupport.setObjectName("actionSupport") + self.actionAbout = QtGui.QAction(parent=MainWindow) + icon = QtGui.QIcon.fromTheme("help-about") + self.actionAbout.setIcon(icon) +@@ -580,9 +596,11 @@ + self.menuFile.addAction(self.actionManageKeys) + self.menuFile.addAction(self.actionDeleteAllTrashedMessages) + self.menuFile.addAction(self.actionRegenerateDeterministicAddresses) ++ self.menuFile.addAction(self.actionNetworkSwitch) + self.menuFile.addAction(self.actionExit) + self.menuSettings.addAction(self.actionSettings) + self.menuHelp.addAction(self.actionHelp) ++ self.menuHelp.addAction(self.actionSupport) + self.menuHelp.addAction(self.actionAbout) + self.menubar.addAction(self.menuFile.menuAction()) + self.menubar.addAction(self.menuSettings.menuAction()) +@@ -606,6 +624,25 @@ + MainWindow.setTabOrder(self.tableWidgetBlacklist, self.tableWidgetConnectionCount) + MainWindow.setTabOrder(self.tableWidgetConnectionCount, self.pushButtonStatusIcon) + ++ # Popup menu actions container for the Sent page ++ # pylint: disable=attribute-defined-outside-init ++ self.sentContextMenuToolbar = QtWidgets.QToolBar() ++ # Popup menu actions container for chans tree ++ self.addressContextMenuToolbar = QtWidgets.QToolBar() ++ # Popup menu actions container for subscriptions tree ++ self.subscriptionsContextMenuToolbar = QtWidgets.QToolBar() ++ ++ def updateNetworkSwitchMenuLabel(self, dontconnect=None): ++ if dontconnect is None: ++ _translate = QtCore.QCoreApplication.translate ++ dontconnect = config.safeGetBoolean( ++ 'bitmessagesettings', 'dontconnect') ++ self.actionNetworkSwitch.setText( ++ _translate("MainWindow", "Go online", None) ++ if dontconnect else ++ _translate("MainWindow", "Go offline", None) ++ ) ++ + def retranslateUi(self, MainWindow): + _translate = QtCore.QCoreApplication.translate + MainWindow.setWindowTitle(_translate("MainWindow", "Bitmessage")) +@@ -653,6 +690,7 @@ + self.tabWidgetSend.setTabText(self.tabWidgetSend.indexOf(self.tab_2), _translate("MainWindow", "Send Message to your Subscribers")) + self.pushButtonTTL.setText(_translate("MainWindow", "TTL:")) + self.labelHumanFriendlyTTLDescription.setText(_translate("MainWindow", "X days")) ++ self.pushButtonClear.setText(_translate("MainWindow", "Clear")) + self.pushButtonSend.setText(_translate("MainWindow", "Send")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.send), _translate("MainWindow", "Send")) + self.treeWidgetSubscriptions.headerItem().setText(0, _translate("MainWindow", "Subscriptions")) +@@ -722,8 +760,10 @@ + self.actionExit.setShortcut(_translate("MainWindow", "Ctrl+Q")) + self.actionHelp.setText(_translate("MainWindow", "Help")) + self.actionHelp.setShortcut(_translate("MainWindow", "F1")) ++ self.actionSupport.setText(_translate("MainWindow", "Contact support")) + self.actionAbout.setText(_translate("MainWindow", "About")) + self.actionSettings.setText(_translate("MainWindow", "Settings")) + self.actionRegenerateDeterministicAddresses.setText(_translate("MainWindow", "Regenerate deterministic addresses")) + self.actionDeleteAllTrashedMessages.setText(_translate("MainWindow", "Delete all trashed messages")) + self.actionJoinChan.setText(_translate("MainWindow", "Join / Create chan")) ++ self.updateNetworkSwitchMenuLabel() diff --git a/src/bitmessageqt/bitmessageui.py b/src/bitmessageqt/bitmessageui.py index 961fc0939d..f85831eb26 100644 --- a/src/bitmessageqt/bitmessageui.py +++ b/src/bitmessageqt/bitmessageui.py @@ -1,59 +1,31 @@ -# -*- coding: utf-8 -*- - # Form implementation generated from reading ui file 'bitmessageui.ui' # -# Created: Mon Mar 23 22:18:07 2015 -# by: PyQt4 UI code generator 4.10.4 +# Created by: PyQt6 UI code generator 6.4.2 # -# WARNING! All changes made in this file will be lost! - -from PyQt4 import QtCore, QtGui -from bmconfigparser import config -from foldertree import AddressBookCompleter -from messageview import MessageView -from messagecompose import MessageCompose -import settingsmixin -from networkstatus import NetworkStatus -from blacklist import Blacklist - -try: - _fromUtf8 = QtCore.QString.fromUtf8 -except AttributeError: - def _fromUtf8(s): - return s +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. -try: - _encoding = QtGui.QApplication.UnicodeUTF8 - - def _translate(context, text, disambig, encoding=QtCore.QCoreApplication.CodecForTr, n=None): - if n is None: - return QtGui.QApplication.translate(context, text, disambig, _encoding) - else: - return QtGui.QApplication.translate(context, text, disambig, _encoding, n) -except AttributeError: - def _translate(context, text, disambig, encoding=QtCore.QCoreApplication.CodecForTr, n=None): - if n is None: - return QtGui.QApplication.translate(context, text, disambig) - else: - return QtGui.QApplication.translate(context, text, disambig, QtCore.QCoreApplication.CodecForTr, n) +from PyQt6 import QtCore, QtGui, QtWidgets +from bmconfigparser import config +from .foldertree import AddressBookCompleter class Ui_MainWindow(object): def setupUi(self, MainWindow): - MainWindow.setObjectName(_fromUtf8("MainWindow")) - MainWindow.resize(885, 580) + MainWindow.setObjectName("MainWindow") + self.MainDock = QtWidgets.QDockWidget(parent=MainWindow) + self.MainDock.setGeometry(QtCore.QRect(0, 0, 885, 580)) icon = QtGui.QIcon() - icon.addPixmap( - QtGui.QPixmap(_fromUtf8(":/newPrefix/images/can-icon-24px.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off - ) - MainWindow.setWindowIcon(icon) - MainWindow.setTabShape(QtGui.QTabWidget.Rounded) - self.centralwidget = QtGui.QWidget(MainWindow) - self.centralwidget.setObjectName(_fromUtf8("centralwidget")) - self.gridLayout_10 = QtGui.QGridLayout(self.centralwidget) - self.gridLayout_10.setObjectName(_fromUtf8("gridLayout_10")) - self.tabWidget = QtGui.QTabWidget(self.centralwidget) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) + icon.addPixmap(QtGui.QPixmap(":/newPrefix/images/can-icon-24px.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.MainDock.setWindowIcon(icon) + self.MainDock.setObjectName("MainDock") + self.centralwidget = QtWidgets.QWidget() + self.centralwidget.setObjectName("centralwidget") + self.gridLayout_10 = QtWidgets.QGridLayout(self.centralwidget) + self.gridLayout_10.setObjectName("gridLayout_10") + self.tabWidget = QtWidgets.QTabWidget(parent=self.centralwidget) + self.tabWidget.setTabShape(QtWidgets.QTabWidget.TabShape.Rounded) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.tabWidget.sizePolicy().hasHeightForWidth()) @@ -63,75 +35,62 @@ def setupUi(self, MainWindow): font = QtGui.QFont() font.setPointSize(9) self.tabWidget.setFont(font) - self.tabWidget.setTabPosition(QtGui.QTabWidget.North) - self.tabWidget.setTabShape(QtGui.QTabWidget.Rounded) - self.tabWidget.setObjectName(_fromUtf8("tabWidget")) - self.inbox = QtGui.QWidget() - self.inbox.setObjectName(_fromUtf8("inbox")) - self.gridLayout = QtGui.QGridLayout(self.inbox) - self.gridLayout.setObjectName(_fromUtf8("gridLayout")) - self.horizontalSplitter_3 = settingsmixin.SSplitter() - self.horizontalSplitter_3.setObjectName(_fromUtf8("horizontalSplitter_3")) - self.verticalSplitter_12 = settingsmixin.SSplitter() - self.verticalSplitter_12.setObjectName(_fromUtf8("verticalSplitter_12")) - self.verticalSplitter_12.setOrientation(QtCore.Qt.Vertical) - self.treeWidgetYourIdentities = settingsmixin.STreeWidget(self.inbox) - self.treeWidgetYourIdentities.setObjectName(_fromUtf8("treeWidgetYourIdentities")) - self.treeWidgetYourIdentities.resize(200, self.treeWidgetYourIdentities.height()) + self.tabWidget.setTabPosition(QtWidgets.QTabWidget.TabPosition.North) + self.tabWidget.setTabShape(QtWidgets.QTabWidget.TabShape.Rounded) + self.tabWidget.setObjectName("tabWidget") + self.inbox = QtWidgets.QWidget() + self.inbox.setObjectName("inbox") + self.gridLayout = QtWidgets.QGridLayout(self.inbox) + self.gridLayout.setObjectName("gridLayout") + self.horizontalLayout_3 = QtWidgets.QHBoxLayout() + self.horizontalLayout_3.setObjectName("horizontalLayout_3") + self.verticalLayout_12 = QtWidgets.QVBoxLayout() + self.verticalLayout_12.setObjectName("verticalLayout_12") + self.treeWidgetYourIdentities = QtWidgets.QTreeWidget(parent=self.inbox) + self.treeWidgetYourIdentities.setMaximumSize(QtCore.QSize(200, 16777215)) + self.treeWidgetYourIdentities.setObjectName("treeWidgetYourIdentities") icon1 = QtGui.QIcon() - icon1.addPixmap( - QtGui.QPixmap(_fromUtf8(":/newPrefix/images/identities.png")), QtGui.QIcon.Selected, QtGui.QIcon.Off - ) + icon1.addPixmap(QtGui.QPixmap(":/newPrefix/images/identities.png"), QtGui.QIcon.Mode.Selected, QtGui.QIcon.State.Off) self.treeWidgetYourIdentities.headerItem().setIcon(0, icon1) - self.verticalSplitter_12.addWidget(self.treeWidgetYourIdentities) - self.pushButtonNewAddress = QtGui.QPushButton(self.inbox) - self.pushButtonNewAddress.setObjectName(_fromUtf8("pushButtonNewAddress")) - self.pushButtonNewAddress.resize(200, self.pushButtonNewAddress.height()) - self.verticalSplitter_12.addWidget(self.pushButtonNewAddress) - self.verticalSplitter_12.setStretchFactor(0, 1) - self.verticalSplitter_12.setStretchFactor(1, 0) - self.verticalSplitter_12.setCollapsible(0, False) - self.verticalSplitter_12.setCollapsible(1, False) - self.verticalSplitter_12.handle(1).setEnabled(False) - self.horizontalSplitter_3.addWidget(self.verticalSplitter_12) - self.verticalSplitter_7 = settingsmixin.SSplitter() - self.verticalSplitter_7.setObjectName(_fromUtf8("verticalSplitter_7")) - self.verticalSplitter_7.setOrientation(QtCore.Qt.Vertical) - self.horizontalSplitterSearch = QtGui.QSplitter() - self.horizontalSplitterSearch.setObjectName(_fromUtf8("horizontalSplitterSearch")) - self.inboxSearchLineEdit = QtGui.QLineEdit(self.inbox) - self.inboxSearchLineEdit.setObjectName(_fromUtf8("inboxSearchLineEdit")) - self.horizontalSplitterSearch.addWidget(self.inboxSearchLineEdit) - self.inboxSearchOption = QtGui.QComboBox(self.inbox) - self.inboxSearchOption.setObjectName(_fromUtf8("inboxSearchOption")) - self.inboxSearchOption.addItem(_fromUtf8("")) - self.inboxSearchOption.addItem(_fromUtf8("")) - self.inboxSearchOption.addItem(_fromUtf8("")) - self.inboxSearchOption.addItem(_fromUtf8("")) - self.inboxSearchOption.addItem(_fromUtf8("")) - self.inboxSearchOption.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContents) - self.inboxSearchOption.setCurrentIndex(3) - self.horizontalSplitterSearch.addWidget(self.inboxSearchOption) - self.horizontalSplitterSearch.handle(1).setEnabled(False) - self.horizontalSplitterSearch.setStretchFactor(0, 1) - self.horizontalSplitterSearch.setStretchFactor(1, 0) - self.verticalSplitter_7.addWidget(self.horizontalSplitterSearch) - self.tableWidgetInbox = settingsmixin.STableWidget(self.inbox) - self.tableWidgetInbox.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers) + self.verticalLayout_12.addWidget(self.treeWidgetYourIdentities) + self.pushButtonNewAddress = QtWidgets.QPushButton(parent=self.inbox) + self.pushButtonNewAddress.setMaximumSize(QtCore.QSize(200, 16777215)) + self.pushButtonNewAddress.setObjectName("pushButtonNewAddress") + self.verticalLayout_12.addWidget(self.pushButtonNewAddress) + self.horizontalLayout_3.addLayout(self.verticalLayout_12) + self.verticalLayout_7 = QtWidgets.QVBoxLayout() + self.verticalLayout_7.setObjectName("verticalLayout_7") + self.horizontalLayoutSearch = QtWidgets.QHBoxLayout() + self.horizontalLayoutSearch.setContentsMargins(-1, 0, -1, -1) + self.horizontalLayoutSearch.setObjectName("horizontalLayoutSearch") + self.inboxSearchLineEdit = QtWidgets.QLineEdit(parent=self.inbox) + self.inboxSearchLineEdit.setObjectName("inboxSearchLineEdit") + self.horizontalLayoutSearch.addWidget(self.inboxSearchLineEdit) + self.inboxSearchOption = QtWidgets.QComboBox(parent=self.inbox) + self.inboxSearchOption.setObjectName("inboxSearchOption") + self.inboxSearchOption.addItem("") + self.inboxSearchOption.addItem("") + self.inboxSearchOption.addItem("") + self.inboxSearchOption.addItem("") + self.inboxSearchOption.addItem("") + self.horizontalLayoutSearch.addWidget(self.inboxSearchOption) + self.verticalLayout_7.addLayout(self.horizontalLayoutSearch) + self.tableWidgetInbox = QtWidgets.QTableWidget(parent=self.inbox) + self.tableWidgetInbox.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers) self.tableWidgetInbox.setAlternatingRowColors(True) - self.tableWidgetInbox.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) - self.tableWidgetInbox.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows) + self.tableWidgetInbox.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.ExtendedSelection) + self.tableWidgetInbox.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows) self.tableWidgetInbox.setWordWrap(False) - self.tableWidgetInbox.setObjectName(_fromUtf8("tableWidgetInbox")) + self.tableWidgetInbox.setObjectName("tableWidgetInbox") self.tableWidgetInbox.setColumnCount(4) self.tableWidgetInbox.setRowCount(0) - item = QtGui.QTableWidgetItem() + item = QtWidgets.QTableWidgetItem() self.tableWidgetInbox.setHorizontalHeaderItem(0, item) - item = QtGui.QTableWidgetItem() + item = QtWidgets.QTableWidgetItem() self.tableWidgetInbox.setHorizontalHeaderItem(1, item) - item = QtGui.QTableWidgetItem() + item = QtWidgets.QTableWidgetItem() self.tableWidgetInbox.setHorizontalHeaderItem(2, item) - item = QtGui.QTableWidgetItem() + item = QtWidgets.QTableWidgetItem() self.tableWidgetInbox.setHorizontalHeaderItem(3, item) self.tableWidgetInbox.horizontalHeader().setCascadingSectionResizes(True) self.tableWidgetInbox.horizontalHeader().setDefaultSectionSize(200) @@ -141,302 +100,243 @@ def setupUi(self, MainWindow): self.tableWidgetInbox.horizontalHeader().setStretchLastSection(True) self.tableWidgetInbox.verticalHeader().setVisible(False) self.tableWidgetInbox.verticalHeader().setDefaultSectionSize(26) - self.verticalSplitter_7.addWidget(self.tableWidgetInbox) - self.textEditInboxMessage = MessageView(self.inbox) + self.verticalLayout_7.addWidget(self.tableWidgetInbox) + self.textEditInboxMessage = QtWidgets.QTextEdit(parent=self.inbox) self.textEditInboxMessage.setBaseSize(QtCore.QSize(0, 500)) self.textEditInboxMessage.setReadOnly(True) - self.textEditInboxMessage.setObjectName(_fromUtf8("textEditInboxMessage")) - self.verticalSplitter_7.addWidget(self.textEditInboxMessage) - self.verticalSplitter_7.setStretchFactor(0, 0) - self.verticalSplitter_7.setStretchFactor(1, 1) - self.verticalSplitter_7.setStretchFactor(2, 2) - self.verticalSplitter_7.setCollapsible(0, False) - self.verticalSplitter_7.setCollapsible(1, False) - self.verticalSplitter_7.setCollapsible(2, False) - self.verticalSplitter_7.handle(1).setEnabled(False) - self.horizontalSplitter_3.addWidget(self.verticalSplitter_7) - self.horizontalSplitter_3.setStretchFactor(0, 0) - self.horizontalSplitter_3.setStretchFactor(1, 1) - self.horizontalSplitter_3.setCollapsible(0, False) - self.horizontalSplitter_3.setCollapsible(1, False) - self.gridLayout.addWidget(self.horizontalSplitter_3) + self.textEditInboxMessage.setObjectName("textEditInboxMessage") + self.verticalLayout_7.addWidget(self.textEditInboxMessage) + self.horizontalLayout_3.addLayout(self.verticalLayout_7) + self.gridLayout.addLayout(self.horizontalLayout_3, 0, 0, 1, 1) icon2 = QtGui.QIcon() - icon2.addPixmap(QtGui.QPixmap(_fromUtf8(":/newPrefix/images/inbox.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.tabWidget.addTab(self.inbox, icon2, _fromUtf8("")) - self.send = QtGui.QWidget() - self.send.setObjectName(_fromUtf8("send")) - self.gridLayout_7 = QtGui.QGridLayout(self.send) - self.gridLayout_7.setObjectName(_fromUtf8("gridLayout_7")) - self.horizontalSplitter = settingsmixin.SSplitter() - self.horizontalSplitter.setObjectName(_fromUtf8("horizontalSplitter")) - self.verticalSplitter_2 = settingsmixin.SSplitter() - self.verticalSplitter_2.setObjectName(_fromUtf8("verticalSplitter_2")) - self.verticalSplitter_2.setOrientation(QtCore.Qt.Vertical) - self.tableWidgetAddressBook = settingsmixin.STableWidget(self.send) + icon2.addPixmap(QtGui.QPixmap(":/newPrefix/images/inbox.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.tabWidget.addTab(self.inbox, icon2, "") + self.send = QtWidgets.QWidget() + self.send.setObjectName("send") + self.gridLayout_7 = QtWidgets.QGridLayout(self.send) + self.gridLayout_7.setObjectName("gridLayout_7") + self.horizontalLayout = QtWidgets.QHBoxLayout() + self.horizontalLayout.setObjectName("horizontalLayout") + self.verticalLayout_2 = QtWidgets.QVBoxLayout() + self.verticalLayout_2.setObjectName("verticalLayout_2") + self.tableWidgetAddressBook = QtWidgets.QTableWidget(parent=self.send) + self.tableWidgetAddressBook.setMaximumSize(QtCore.QSize(200, 16777215)) self.tableWidgetAddressBook.setAlternatingRowColors(True) - self.tableWidgetAddressBook.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) - self.tableWidgetAddressBook.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows) - self.tableWidgetAddressBook.setObjectName(_fromUtf8("tableWidgetAddressBook")) + self.tableWidgetAddressBook.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.ExtendedSelection) + self.tableWidgetAddressBook.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows) + self.tableWidgetAddressBook.setObjectName("tableWidgetAddressBook") self.tableWidgetAddressBook.setColumnCount(2) self.tableWidgetAddressBook.setRowCount(0) - self.tableWidgetAddressBook.resize(200, self.tableWidgetAddressBook.height()) - item = QtGui.QTableWidgetItem() + item = QtWidgets.QTableWidgetItem() icon3 = QtGui.QIcon() - icon3.addPixmap( - QtGui.QPixmap(_fromUtf8(":/newPrefix/images/addressbook.png")), QtGui.QIcon.Selected, QtGui.QIcon.Off - ) + icon3.addPixmap(QtGui.QPixmap(":/newPrefix/images/addressbook.png"), QtGui.QIcon.Mode.Selected, QtGui.QIcon.State.Off) item.setIcon(icon3) self.tableWidgetAddressBook.setHorizontalHeaderItem(0, item) - item = QtGui.QTableWidgetItem() + item = QtWidgets.QTableWidgetItem() self.tableWidgetAddressBook.setHorizontalHeaderItem(1, item) self.tableWidgetAddressBook.horizontalHeader().setCascadingSectionResizes(True) self.tableWidgetAddressBook.horizontalHeader().setDefaultSectionSize(200) self.tableWidgetAddressBook.horizontalHeader().setHighlightSections(False) self.tableWidgetAddressBook.horizontalHeader().setStretchLastSection(True) self.tableWidgetAddressBook.verticalHeader().setVisible(False) - self.verticalSplitter_2.addWidget(self.tableWidgetAddressBook) + self.verticalLayout_2.addWidget(self.tableWidgetAddressBook) self.addressBookCompleter = AddressBookCompleter() - self.addressBookCompleter.setCompletionMode(QtGui.QCompleter.PopupCompletion) - self.addressBookCompleter.setCaseSensitivity(QtCore.Qt.CaseInsensitive) - self.addressBookCompleterModel = QtGui.QStringListModel() + self.addressBookCompleter.setCompletionMode(QtWidgets.QCompleter.CompletionMode.PopupCompletion) + self.addressBookCompleter.setCaseSensitivity(QtCore.Qt.CaseSensitivity.CaseInsensitive) + self.addressBookCompleterModel = QtCore.QStringListModel() self.addressBookCompleter.setModel(self.addressBookCompleterModel) - self.pushButtonAddAddressBook = QtGui.QPushButton(self.send) - self.pushButtonAddAddressBook.setObjectName(_fromUtf8("pushButtonAddAddressBook")) - self.pushButtonAddAddressBook.resize(200, self.pushButtonAddAddressBook.height()) - self.verticalSplitter_2.addWidget(self.pushButtonAddAddressBook) - self.pushButtonFetchNamecoinID = QtGui.QPushButton(self.send) - self.pushButtonFetchNamecoinID.resize(200, self.pushButtonFetchNamecoinID.height()) - self.pushButtonFetchNamecoinID.setObjectName(_fromUtf8("pushButtonFetchNamecoinID")) - self.verticalSplitter_2.addWidget(self.pushButtonFetchNamecoinID) - self.verticalSplitter_2.setStretchFactor(0, 1) - self.verticalSplitter_2.setStretchFactor(1, 0) - self.verticalSplitter_2.setStretchFactor(2, 0) - self.verticalSplitter_2.setCollapsible(0, False) - self.verticalSplitter_2.setCollapsible(1, False) - self.verticalSplitter_2.setCollapsible(2, False) - self.verticalSplitter_2.handle(1).setEnabled(False) - self.verticalSplitter_2.handle(2).setEnabled(False) - self.horizontalSplitter.addWidget(self.verticalSplitter_2) - self.verticalSplitter = settingsmixin.SSplitter() - self.verticalSplitter.setObjectName(_fromUtf8("verticalSplitter")) - self.verticalSplitter.setOrientation(QtCore.Qt.Vertical) - self.tabWidgetSend = QtGui.QTabWidget(self.send) - self.tabWidgetSend.setObjectName(_fromUtf8("tabWidgetSend")) - self.sendDirect = QtGui.QWidget() - self.sendDirect.setObjectName(_fromUtf8("sendDirect")) - self.gridLayout_8 = QtGui.QGridLayout(self.sendDirect) - self.gridLayout_8.setObjectName(_fromUtf8("gridLayout_8")) - self.verticalSplitter_5 = settingsmixin.SSplitter() - self.verticalSplitter_5.setObjectName(_fromUtf8("verticalSplitter_5")) - self.verticalSplitter_5.setOrientation(QtCore.Qt.Vertical) - self.gridLayout_2 = QtGui.QGridLayout() - self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2")) - self.label_3 = QtGui.QLabel(self.sendDirect) - self.label_3.setObjectName(_fromUtf8("label_3")) + self.pushButtonAddAddressBook = QtWidgets.QPushButton(parent=self.send) + self.pushButtonAddAddressBook.setMaximumSize(QtCore.QSize(200, 16777215)) + self.pushButtonAddAddressBook.setObjectName("pushButtonAddAddressBook") + self.verticalLayout_2.addWidget(self.pushButtonAddAddressBook) + self.pushButtonFetchNamecoinID = QtWidgets.QPushButton(parent=self.send) + self.pushButtonFetchNamecoinID.setMaximumSize(QtCore.QSize(200, 16777215)) + font = QtGui.QFont() + font.setPointSize(9) + self.pushButtonFetchNamecoinID.setFont(font) + self.pushButtonFetchNamecoinID.setObjectName("pushButtonFetchNamecoinID") + self.verticalLayout_2.addWidget(self.pushButtonFetchNamecoinID) + self.horizontalLayout.addLayout(self.verticalLayout_2) + self.verticalLayout = QtWidgets.QVBoxLayout() + self.verticalLayout.setObjectName("verticalLayout") + self.tabWidgetSend = QtWidgets.QTabWidget(parent=self.send) + self.tabWidgetSend.setObjectName("tabWidgetSend") + self.tab = QtWidgets.QWidget() + self.tab.setObjectName("tab") + self.gridLayout_8 = QtWidgets.QGridLayout(self.tab) + self.gridLayout_8.setObjectName("gridLayout_8") + self.verticalLayout_5 = QtWidgets.QVBoxLayout() + self.verticalLayout_5.setObjectName("verticalLayout_5") + self.gridLayout_2 = QtWidgets.QGridLayout() + self.gridLayout_2.setObjectName("gridLayout_2") + self.label_3 = QtWidgets.QLabel(parent=self.tab) + self.label_3.setObjectName("label_3") self.gridLayout_2.addWidget(self.label_3, 2, 0, 1, 1) - self.label_2 = QtGui.QLabel(self.sendDirect) - self.label_2.setObjectName(_fromUtf8("label_2")) + self.label_2 = QtWidgets.QLabel(parent=self.tab) + self.label_2.setObjectName("label_2") self.gridLayout_2.addWidget(self.label_2, 0, 0, 1, 1) - self.lineEditSubject = QtGui.QLineEdit(self.sendDirect) - self.lineEditSubject.setText(_fromUtf8("")) - self.lineEditSubject.setObjectName(_fromUtf8("lineEditSubject")) + self.lineEditSubject = QtWidgets.QLineEdit(parent=self.tab) + self.lineEditSubject.setText("") + self.lineEditSubject.setObjectName("lineEditSubject") self.gridLayout_2.addWidget(self.lineEditSubject, 2, 1, 1, 1) - self.label = QtGui.QLabel(self.sendDirect) - self.label.setObjectName(_fromUtf8("label")) + self.label = QtWidgets.QLabel(parent=self.tab) + self.label.setObjectName("label") self.gridLayout_2.addWidget(self.label, 1, 0, 1, 1) - self.comboBoxSendFrom = QtGui.QComboBox(self.sendDirect) + self.comboBoxSendFrom = QtWidgets.QComboBox(parent=self.tab) self.comboBoxSendFrom.setMinimumSize(QtCore.QSize(300, 0)) - self.comboBoxSendFrom.setObjectName(_fromUtf8("comboBoxSendFrom")) + self.comboBoxSendFrom.setObjectName("comboBoxSendFrom") self.gridLayout_2.addWidget(self.comboBoxSendFrom, 0, 1, 1, 1) - self.lineEditTo = QtGui.QLineEdit(self.sendDirect) - self.lineEditTo.setObjectName(_fromUtf8("lineEditTo")) + self.lineEditTo = QtWidgets.QLineEdit(parent=self.tab) + self.lineEditTo.setObjectName("lineEditTo") self.gridLayout_2.addWidget(self.lineEditTo, 1, 1, 1, 1) self.lineEditTo.setCompleter(self.addressBookCompleter) - self.gridLayout_2_Widget = QtGui.QWidget() - self.gridLayout_2_Widget.setLayout(self.gridLayout_2) - self.verticalSplitter_5.addWidget(self.gridLayout_2_Widget) - self.textEditMessage = MessageCompose(self.sendDirect) - self.textEditMessage.setObjectName(_fromUtf8("textEditMessage")) - self.verticalSplitter_5.addWidget(self.textEditMessage) - self.verticalSplitter_5.setStretchFactor(0, 0) - self.verticalSplitter_5.setStretchFactor(1, 1) - self.verticalSplitter_5.setCollapsible(0, False) - self.verticalSplitter_5.setCollapsible(1, False) - self.verticalSplitter_5.handle(1).setEnabled(False) - self.gridLayout_8.addWidget(self.verticalSplitter_5, 0, 0, 1, 1) - self.tabWidgetSend.addTab(self.sendDirect, _fromUtf8("")) - self.sendBroadcast = QtGui.QWidget() - self.sendBroadcast.setObjectName(_fromUtf8("sendBroadcast")) - self.gridLayout_9 = QtGui.QGridLayout(self.sendBroadcast) - self.gridLayout_9.setObjectName(_fromUtf8("gridLayout_9")) - self.verticalSplitter_6 = settingsmixin.SSplitter() - self.verticalSplitter_6.setObjectName(_fromUtf8("verticalSplitter_6")) - self.verticalSplitter_6.setOrientation(QtCore.Qt.Vertical) - self.gridLayout_5 = QtGui.QGridLayout() - self.gridLayout_5.setObjectName(_fromUtf8("gridLayout_5")) - self.label_8 = QtGui.QLabel(self.sendBroadcast) - self.label_8.setObjectName(_fromUtf8("label_8")) + self.verticalLayout_5.addLayout(self.gridLayout_2) + self.textEditMessage = QtWidgets.QTextEdit(parent=self.tab) + self.textEditMessage.setObjectName("textEditMessage") + self.verticalLayout_5.addWidget(self.textEditMessage) + self.gridLayout_8.addLayout(self.verticalLayout_5, 0, 0, 1, 1) + self.tabWidgetSend.addTab(self.tab, "") + self.tab_2 = QtWidgets.QWidget() + self.tab_2.setObjectName("tab_2") + self.gridLayout_9 = QtWidgets.QGridLayout(self.tab_2) + self.gridLayout_9.setObjectName("gridLayout_9") + self.verticalLayout_6 = QtWidgets.QVBoxLayout() + self.verticalLayout_6.setObjectName("verticalLayout_6") + self.gridLayout_5 = QtWidgets.QGridLayout() + self.gridLayout_5.setObjectName("gridLayout_5") + self.label_8 = QtWidgets.QLabel(parent=self.tab_2) + self.label_8.setObjectName("label_8") self.gridLayout_5.addWidget(self.label_8, 0, 0, 1, 1) - self.lineEditSubjectBroadcast = QtGui.QLineEdit(self.sendBroadcast) - self.lineEditSubjectBroadcast.setText(_fromUtf8("")) - self.lineEditSubjectBroadcast.setObjectName(_fromUtf8("lineEditSubjectBroadcast")) + self.lineEditSubjectBroadcast = QtWidgets.QLineEdit(parent=self.tab_2) + self.lineEditSubjectBroadcast.setText("") + self.lineEditSubjectBroadcast.setObjectName("lineEditSubjectBroadcast") self.gridLayout_5.addWidget(self.lineEditSubjectBroadcast, 1, 1, 1, 1) - self.label_7 = QtGui.QLabel(self.sendBroadcast) - self.label_7.setObjectName(_fromUtf8("label_7")) + self.label_7 = QtWidgets.QLabel(parent=self.tab_2) + self.label_7.setObjectName("label_7") self.gridLayout_5.addWidget(self.label_7, 1, 0, 1, 1) - self.comboBoxSendFromBroadcast = QtGui.QComboBox(self.sendBroadcast) + self.comboBoxSendFromBroadcast = QtWidgets.QComboBox(parent=self.tab_2) self.comboBoxSendFromBroadcast.setMinimumSize(QtCore.QSize(300, 0)) - self.comboBoxSendFromBroadcast.setObjectName(_fromUtf8("comboBoxSendFromBroadcast")) + self.comboBoxSendFromBroadcast.setObjectName("comboBoxSendFromBroadcast") self.gridLayout_5.addWidget(self.comboBoxSendFromBroadcast, 0, 1, 1, 1) - self.gridLayout_5_Widget = QtGui.QWidget() - self.gridLayout_5_Widget.setLayout(self.gridLayout_5) - self.verticalSplitter_6.addWidget(self.gridLayout_5_Widget) - self.textEditMessageBroadcast = MessageCompose(self.sendBroadcast) - self.textEditMessageBroadcast.setObjectName(_fromUtf8("textEditMessageBroadcast")) - self.verticalSplitter_6.addWidget(self.textEditMessageBroadcast) - self.verticalSplitter_6.setStretchFactor(0, 0) - self.verticalSplitter_6.setStretchFactor(1, 1) - self.verticalSplitter_6.setCollapsible(0, False) - self.verticalSplitter_6.setCollapsible(1, False) - self.verticalSplitter_6.handle(1).setEnabled(False) - self.gridLayout_9.addWidget(self.verticalSplitter_6, 0, 0, 1, 1) - self.tabWidgetSend.addTab(self.sendBroadcast, _fromUtf8("")) - self.verticalSplitter.addWidget(self.tabWidgetSend) - self.tTLContainer = QtGui.QWidget() - self.tTLContainer.setSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.Fixed) - self.horizontalLayout_5 = QtGui.QHBoxLayout() - self.tTLContainer.setLayout(self.horizontalLayout_5) - self.horizontalLayout_5.setObjectName(_fromUtf8("horizontalLayout_5")) - self.pushButtonTTL = QtGui.QPushButton(self.send) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.Fixed) + self.verticalLayout_6.addLayout(self.gridLayout_5) + self.textEditMessageBroadcast = QtWidgets.QTextEdit(parent=self.tab_2) + self.textEditMessageBroadcast.setObjectName("textEditMessageBroadcast") + self.verticalLayout_6.addWidget(self.textEditMessageBroadcast) + self.gridLayout_9.addLayout(self.verticalLayout_6, 0, 0, 1, 1) + self.tabWidgetSend.addTab(self.tab_2, "") + self.verticalLayout.addWidget(self.tabWidgetSend) + self.horizontalLayout_5 = QtWidgets.QHBoxLayout() + self.horizontalLayout_5.setObjectName("horizontalLayout_5") + self.pushButtonTTL = QtWidgets.QPushButton(parent=self.send) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.pushButtonTTL.sizePolicy().hasHeightForWidth()) self.pushButtonTTL.setSizePolicy(sizePolicy) + self.pushButtonTTL.setMaximumSize(QtCore.QSize(32, 16777215)) palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(0, 0, 255)) - brush.setStyle(QtCore.Qt.SolidPattern) - palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ButtonText, brush) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Active, QtGui.QPalette.ColorRole.ButtonText, brush) brush = QtGui.QBrush(QtGui.QColor(0, 0, 255)) - brush.setStyle(QtCore.Qt.SolidPattern) - palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ButtonText, brush) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Inactive, QtGui.QPalette.ColorRole.ButtonText, brush) brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) - brush.setStyle(QtCore.Qt.SolidPattern) - palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ButtonText, brush) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.ButtonText, brush) self.pushButtonTTL.setPalette(palette) font = QtGui.QFont() font.setUnderline(True) self.pushButtonTTL.setFont(font) self.pushButtonTTL.setFlat(True) - self.pushButtonTTL.setObjectName(_fromUtf8("pushButtonTTL")) - self.horizontalLayout_5.addWidget(self.pushButtonTTL, 0, QtCore.Qt.AlignRight) - self.horizontalSliderTTL = QtGui.QSlider(self.send) - self.horizontalSliderTTL.setMinimumSize(QtCore.QSize(70, 0)) - self.horizontalSliderTTL.setOrientation(QtCore.Qt.Horizontal) + self.pushButtonTTL.setObjectName("pushButtonTTL") + self.horizontalLayout_5.addWidget(self.pushButtonTTL) + self.horizontalSliderTTL = QtWidgets.QSlider(parent=self.send) + self.horizontalSliderTTL.setMinimumSize(QtCore.QSize(35, 0)) + self.horizontalSliderTTL.setMaximumSize(QtCore.QSize(70, 16777215)) + self.horizontalSliderTTL.setOrientation(QtCore.Qt.Orientation.Horizontal) self.horizontalSliderTTL.setInvertedAppearance(False) self.horizontalSliderTTL.setInvertedControls(False) - self.horizontalSliderTTL.setObjectName(_fromUtf8("horizontalSliderTTL")) - self.horizontalLayout_5.addWidget(self.horizontalSliderTTL, 0, QtCore.Qt.AlignLeft) - self.labelHumanFriendlyTTLDescription = QtGui.QLabel(self.send) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.Fixed) + self.horizontalSliderTTL.setObjectName("horizontalSliderTTL") + self.horizontalLayout_5.addWidget(self.horizontalSliderTTL) + self.labelHumanFriendlyTTLDescription = QtWidgets.QLabel(parent=self.send) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.labelHumanFriendlyTTLDescription.sizePolicy().hasHeightForWidth()) self.labelHumanFriendlyTTLDescription.setSizePolicy(sizePolicy) self.labelHumanFriendlyTTLDescription.setMinimumSize(QtCore.QSize(45, 0)) - self.labelHumanFriendlyTTLDescription.setObjectName(_fromUtf8("labelHumanFriendlyTTLDescription")) - self.horizontalLayout_5.addWidget(self.labelHumanFriendlyTTLDescription, 1, QtCore.Qt.AlignLeft) - self.pushButtonClear = QtGui.QPushButton(self.send) - self.pushButtonClear.setObjectName(_fromUtf8("pushButtonClear")) - self.horizontalLayout_5.addWidget(self.pushButtonClear, 0, QtCore.Qt.AlignRight) - self.pushButtonSend = QtGui.QPushButton(self.send) - self.pushButtonSend.setObjectName(_fromUtf8("pushButtonSend")) - self.horizontalLayout_5.addWidget(self.pushButtonSend, 0, QtCore.Qt.AlignRight) - self.horizontalSliderTTL.setMaximumSize(QtCore.QSize(105, self.pushButtonSend.height())) - self.verticalSplitter.addWidget(self.tTLContainer) - self.tTLContainer.adjustSize() - self.verticalSplitter.setStretchFactor(1, 0) - self.verticalSplitter.setStretchFactor(0, 1) - self.verticalSplitter.setCollapsible(0, False) - self.verticalSplitter.setCollapsible(1, False) - self.verticalSplitter.handle(1).setEnabled(False) - self.horizontalSplitter.addWidget(self.verticalSplitter) - self.horizontalSplitter.setStretchFactor(0, 0) - self.horizontalSplitter.setStretchFactor(1, 1) - self.horizontalSplitter.setCollapsible(0, False) - self.horizontalSplitter.setCollapsible(1, False) - self.gridLayout_7.addWidget(self.horizontalSplitter, 0, 0, 1, 1) + self.labelHumanFriendlyTTLDescription.setMaximumSize(QtCore.QSize(45, 16777215)) + self.labelHumanFriendlyTTLDescription.setObjectName("labelHumanFriendlyTTLDescription") + self.horizontalLayout_5.addWidget(self.labelHumanFriendlyTTLDescription) + self.pushButtonClear = QtWidgets.QPushButton(parent=self.send) + self.pushButtonClear.setObjectName("pushButtonClear") + self.horizontalLayout_5.addWidget(self.pushButtonClear, 0, QtCore.Qt.AlignmentFlag.AlignRight) + self.pushButtonSend = QtWidgets.QPushButton(parent=self.send) + self.pushButtonSend.setMaximumSize(QtCore.QSize(16777215, 16777215)) + self.pushButtonSend.setObjectName("pushButtonSend") + self.horizontalLayout_5.addWidget(self.pushButtonSend) + self.verticalLayout.addLayout(self.horizontalLayout_5) + self.horizontalLayout.addLayout(self.verticalLayout) + self.gridLayout_7.addLayout(self.horizontalLayout, 0, 0, 1, 1) icon4 = QtGui.QIcon() - icon4.addPixmap(QtGui.QPixmap(_fromUtf8(":/newPrefix/images/send.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.tabWidget.addTab(self.send, icon4, _fromUtf8("")) - self.subscriptions = QtGui.QWidget() - self.subscriptions.setObjectName(_fromUtf8("subscriptions")) - self.gridLayout_3 = QtGui.QGridLayout(self.subscriptions) - self.gridLayout_3.setObjectName(_fromUtf8("gridLayout_3")) - self.horizontalSplitter_4 = settingsmixin.SSplitter() - self.horizontalSplitter_4.setObjectName(_fromUtf8("horizontalSplitter_4")) - self.verticalSplitter_3 = settingsmixin.SSplitter() - self.verticalSplitter_3.setObjectName(_fromUtf8("verticalSplitter_3")) - self.verticalSplitter_3.setOrientation(QtCore.Qt.Vertical) - self.treeWidgetSubscriptions = settingsmixin.STreeWidget(self.subscriptions) + icon4.addPixmap(QtGui.QPixmap(":/newPrefix/images/send.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.tabWidget.addTab(self.send, icon4, "") + self.subscriptions = QtWidgets.QWidget() + self.subscriptions.setObjectName("subscriptions") + self.gridLayout_3 = QtWidgets.QGridLayout(self.subscriptions) + self.gridLayout_3.setObjectName("gridLayout_3") + self.horizontalLayout_4 = QtWidgets.QHBoxLayout() + self.horizontalLayout_4.setObjectName("horizontalLayout_4") + self.verticalLayout_3 = QtWidgets.QVBoxLayout() + self.verticalLayout_3.setObjectName("verticalLayout_3") + self.treeWidgetSubscriptions = QtWidgets.QTreeWidget(parent=self.subscriptions) + self.treeWidgetSubscriptions.setMaximumSize(QtCore.QSize(200, 16777215)) self.treeWidgetSubscriptions.setAlternatingRowColors(True) - self.treeWidgetSubscriptions.setSelectionMode(QtGui.QAbstractItemView.SingleSelection) - self.treeWidgetSubscriptions.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows) - self.treeWidgetSubscriptions.setObjectName(_fromUtf8("treeWidgetSubscriptions")) - self.treeWidgetSubscriptions.resize(200, self.treeWidgetSubscriptions.height()) + self.treeWidgetSubscriptions.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.SingleSelection) + self.treeWidgetSubscriptions.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows) + self.treeWidgetSubscriptions.setObjectName("treeWidgetSubscriptions") icon5 = QtGui.QIcon() - icon5.addPixmap( - QtGui.QPixmap(_fromUtf8(":/newPrefix/images/subscriptions.png")), QtGui.QIcon.Selected, QtGui.QIcon.Off - ) + icon5.addPixmap(QtGui.QPixmap(":/newPrefix/images/subscriptions.png"), QtGui.QIcon.Mode.Selected, QtGui.QIcon.State.Off) self.treeWidgetSubscriptions.headerItem().setIcon(0, icon5) - self.verticalSplitter_3.addWidget(self.treeWidgetSubscriptions) - self.pushButtonAddSubscription = QtGui.QPushButton(self.subscriptions) - self.pushButtonAddSubscription.setObjectName(_fromUtf8("pushButtonAddSubscription")) - self.pushButtonAddSubscription.resize(200, self.pushButtonAddSubscription.height()) - self.verticalSplitter_3.addWidget(self.pushButtonAddSubscription) - self.verticalSplitter_3.setStretchFactor(0, 1) - self.verticalSplitter_3.setStretchFactor(1, 0) - self.verticalSplitter_3.setCollapsible(0, False) - self.verticalSplitter_3.setCollapsible(1, False) - self.verticalSplitter_3.handle(1).setEnabled(False) - self.horizontalSplitter_4.addWidget(self.verticalSplitter_3) - self.verticalSplitter_4 = settingsmixin.SSplitter() - self.verticalSplitter_4.setObjectName(_fromUtf8("verticalSplitter_4")) - self.verticalSplitter_4.setOrientation(QtCore.Qt.Vertical) - self.horizontalSplitter_2 = QtGui.QSplitter() - self.horizontalSplitter_2.setObjectName(_fromUtf8("horizontalSplitter_2")) - self.inboxSearchLineEditSubscriptions = QtGui.QLineEdit(self.subscriptions) - self.inboxSearchLineEditSubscriptions.setObjectName(_fromUtf8("inboxSearchLineEditSubscriptions")) - self.horizontalSplitter_2.addWidget(self.inboxSearchLineEditSubscriptions) - self.inboxSearchOptionSubscriptions = QtGui.QComboBox(self.subscriptions) - self.inboxSearchOptionSubscriptions.setObjectName(_fromUtf8("inboxSearchOptionSubscriptions")) - self.inboxSearchOptionSubscriptions.addItem(_fromUtf8("")) - self.inboxSearchOptionSubscriptions.addItem(_fromUtf8("")) - self.inboxSearchOptionSubscriptions.addItem(_fromUtf8("")) - self.inboxSearchOptionSubscriptions.addItem(_fromUtf8("")) - self.inboxSearchOptionSubscriptions.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContents) - self.inboxSearchOptionSubscriptions.setCurrentIndex(2) - self.horizontalSplitter_2.addWidget(self.inboxSearchOptionSubscriptions) - self.horizontalSplitter_2.handle(1).setEnabled(False) - self.horizontalSplitter_2.setStretchFactor(0, 1) - self.horizontalSplitter_2.setStretchFactor(1, 0) - self.verticalSplitter_4.addWidget(self.horizontalSplitter_2) - self.tableWidgetInboxSubscriptions = settingsmixin.STableWidget(self.subscriptions) - self.tableWidgetInboxSubscriptions.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers) + self.verticalLayout_3.addWidget(self.treeWidgetSubscriptions) + self.pushButtonAddSubscription = QtWidgets.QPushButton(parent=self.subscriptions) + self.pushButtonAddSubscription.setMaximumSize(QtCore.QSize(200, 16777215)) + self.pushButtonAddSubscription.setObjectName("pushButtonAddSubscription") + self.verticalLayout_3.addWidget(self.pushButtonAddSubscription) + self.horizontalLayout_4.addLayout(self.verticalLayout_3) + self.verticalLayout_4 = QtWidgets.QVBoxLayout() + self.verticalLayout_4.setObjectName("verticalLayout_4") + self.horizontalLayout_2 = QtWidgets.QHBoxLayout() + self.horizontalLayout_2.setObjectName("horizontalLayout_2") + self.inboxSearchLineEditSubscriptions = QtWidgets.QLineEdit(parent=self.subscriptions) + self.inboxSearchLineEditSubscriptions.setObjectName("inboxSearchLineEditSubscriptions") + self.horizontalLayout_2.addWidget(self.inboxSearchLineEditSubscriptions) + self.inboxSearchOptionSubscriptions = QtWidgets.QComboBox(parent=self.subscriptions) + self.inboxSearchOptionSubscriptions.setObjectName("inboxSearchOptionSubscriptions") + self.inboxSearchOptionSubscriptions.addItem("") + self.inboxSearchOptionSubscriptions.addItem("") + self.inboxSearchOptionSubscriptions.addItem("") + self.inboxSearchOptionSubscriptions.addItem("") + self.inboxSearchOptionSubscriptions.addItem("") + self.horizontalLayout_2.addWidget(self.inboxSearchOptionSubscriptions) + self.verticalLayout_4.addLayout(self.horizontalLayout_2) + self.tableWidgetInboxSubscriptions = QtWidgets.QTableWidget(parent=self.subscriptions) + self.tableWidgetInboxSubscriptions.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers) self.tableWidgetInboxSubscriptions.setAlternatingRowColors(True) - self.tableWidgetInboxSubscriptions.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) - self.tableWidgetInboxSubscriptions.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows) + self.tableWidgetInboxSubscriptions.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.ExtendedSelection) + self.tableWidgetInboxSubscriptions.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows) self.tableWidgetInboxSubscriptions.setWordWrap(False) - self.tableWidgetInboxSubscriptions.setObjectName(_fromUtf8("tableWidgetInboxSubscriptions")) + self.tableWidgetInboxSubscriptions.setObjectName("tableWidgetInboxSubscriptions") self.tableWidgetInboxSubscriptions.setColumnCount(4) self.tableWidgetInboxSubscriptions.setRowCount(0) - item = QtGui.QTableWidgetItem() + item = QtWidgets.QTableWidgetItem() self.tableWidgetInboxSubscriptions.setHorizontalHeaderItem(0, item) - item = QtGui.QTableWidgetItem() + item = QtWidgets.QTableWidgetItem() self.tableWidgetInboxSubscriptions.setHorizontalHeaderItem(1, item) - item = QtGui.QTableWidgetItem() + item = QtWidgets.QTableWidgetItem() self.tableWidgetInboxSubscriptions.setHorizontalHeaderItem(2, item) - item = QtGui.QTableWidgetItem() + item = QtWidgets.QTableWidgetItem() self.tableWidgetInboxSubscriptions.setHorizontalHeaderItem(3, item) self.tableWidgetInboxSubscriptions.horizontalHeader().setCascadingSectionResizes(True) self.tableWidgetInboxSubscriptions.horizontalHeader().setDefaultSectionSize(200) @@ -446,101 +346,74 @@ def setupUi(self, MainWindow): self.tableWidgetInboxSubscriptions.horizontalHeader().setStretchLastSection(True) self.tableWidgetInboxSubscriptions.verticalHeader().setVisible(False) self.tableWidgetInboxSubscriptions.verticalHeader().setDefaultSectionSize(26) - self.verticalSplitter_4.addWidget(self.tableWidgetInboxSubscriptions) - self.textEditInboxMessageSubscriptions = MessageView(self.subscriptions) + self.verticalLayout_4.addWidget(self.tableWidgetInboxSubscriptions) + self.textEditInboxMessageSubscriptions = QtWidgets.QTextEdit(parent=self.subscriptions) self.textEditInboxMessageSubscriptions.setBaseSize(QtCore.QSize(0, 500)) self.textEditInboxMessageSubscriptions.setReadOnly(True) - self.textEditInboxMessageSubscriptions.setObjectName(_fromUtf8("textEditInboxMessageSubscriptions")) - self.verticalSplitter_4.addWidget(self.textEditInboxMessageSubscriptions) - self.verticalSplitter_4.setStretchFactor(0, 0) - self.verticalSplitter_4.setStretchFactor(1, 1) - self.verticalSplitter_4.setStretchFactor(2, 2) - self.verticalSplitter_4.setCollapsible(0, False) - self.verticalSplitter_4.setCollapsible(1, False) - self.verticalSplitter_4.setCollapsible(2, False) - self.verticalSplitter_4.handle(1).setEnabled(False) - self.horizontalSplitter_4.addWidget(self.verticalSplitter_4) - self.horizontalSplitter_4.setStretchFactor(0, 0) - self.horizontalSplitter_4.setStretchFactor(1, 1) - self.horizontalSplitter_4.setCollapsible(0, False) - self.horizontalSplitter_4.setCollapsible(1, False) - self.gridLayout_3.addWidget(self.horizontalSplitter_4, 0, 0, 1, 1) + self.textEditInboxMessageSubscriptions.setObjectName("textEditInboxMessageSubscriptions") + self.verticalLayout_4.addWidget(self.textEditInboxMessageSubscriptions) + self.horizontalLayout_4.addLayout(self.verticalLayout_4) + self.gridLayout_3.addLayout(self.horizontalLayout_4, 0, 0, 1, 1) icon6 = QtGui.QIcon() - icon6.addPixmap( - QtGui.QPixmap(_fromUtf8(":/newPrefix/images/subscriptions.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off - ) - self.tabWidget.addTab(self.subscriptions, icon6, _fromUtf8("")) - self.chans = QtGui.QWidget() - self.chans.setObjectName(_fromUtf8("chans")) - self.gridLayout_4 = QtGui.QGridLayout(self.chans) - self.gridLayout_4.setObjectName(_fromUtf8("gridLayout_4")) - self.horizontalSplitter_7 = settingsmixin.SSplitter() - self.horizontalSplitter_7.setObjectName(_fromUtf8("horizontalSplitter_7")) - self.verticalSplitter_17 = settingsmixin.SSplitter() - self.verticalSplitter_17.setObjectName(_fromUtf8("verticalSplitter_17")) - self.verticalSplitter_17.setOrientation(QtCore.Qt.Vertical) - self.treeWidgetChans = settingsmixin.STreeWidget(self.chans) - self.treeWidgetChans.setFrameShadow(QtGui.QFrame.Sunken) + icon6.addPixmap(QtGui.QPixmap(":/newPrefix/images/subscriptions.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.tabWidget.addTab(self.subscriptions, icon6, "") + self.tab_3 = QtWidgets.QWidget() + self.tab_3.setObjectName("tab_3") + self.gridLayout_4 = QtWidgets.QGridLayout(self.tab_3) + self.gridLayout_4.setObjectName("gridLayout_4") + self.horizontalLayout_7 = QtWidgets.QHBoxLayout() + self.horizontalLayout_7.setObjectName("horizontalLayout_7") + self.verticalLayout_17 = QtWidgets.QVBoxLayout() + self.verticalLayout_17.setObjectName("verticalLayout_17") + self.treeWidgetChans = QtWidgets.QTreeWidget(parent=self.tab_3) + self.treeWidgetChans.setMaximumSize(QtCore.QSize(200, 16777215)) + self.treeWidgetChans.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) self.treeWidgetChans.setLineWidth(1) self.treeWidgetChans.setAlternatingRowColors(True) - self.treeWidgetChans.setSelectionMode(QtGui.QAbstractItemView.SingleSelection) - self.treeWidgetChans.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows) - self.treeWidgetChans.setObjectName(_fromUtf8("treeWidgetChans")) - self.treeWidgetChans.resize(200, self.treeWidgetChans.height()) + self.treeWidgetChans.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.SingleSelection) + self.treeWidgetChans.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows) + self.treeWidgetChans.setObjectName("treeWidgetChans") icon7 = QtGui.QIcon() - icon7.addPixmap( - QtGui.QPixmap(_fromUtf8(":/newPrefix/images/can-icon-16px.png")), QtGui.QIcon.Selected, QtGui.QIcon.Off - ) + icon7.addPixmap(QtGui.QPixmap(":/newPrefix/images/can-icon-16px.png"), QtGui.QIcon.Mode.Selected, QtGui.QIcon.State.Off) self.treeWidgetChans.headerItem().setIcon(0, icon7) - self.verticalSplitter_17.addWidget(self.treeWidgetChans) - self.pushButtonAddChan = QtGui.QPushButton(self.chans) - self.pushButtonAddChan.setObjectName(_fromUtf8("pushButtonAddChan")) - self.pushButtonAddChan.resize(200, self.pushButtonAddChan.height()) - self.verticalSplitter_17.addWidget(self.pushButtonAddChan) - self.verticalSplitter_17.setStretchFactor(0, 1) - self.verticalSplitter_17.setStretchFactor(1, 0) - self.verticalSplitter_17.setCollapsible(0, False) - self.verticalSplitter_17.setCollapsible(1, False) - self.verticalSplitter_17.handle(1).setEnabled(False) - self.horizontalSplitter_7.addWidget(self.verticalSplitter_17) - self.verticalSplitter_8 = settingsmixin.SSplitter() - self.verticalSplitter_8.setObjectName(_fromUtf8("verticalSplitter_8")) - self.verticalSplitter_8.setOrientation(QtCore.Qt.Vertical) - self.horizontalSplitter_6 = QtGui.QSplitter() - self.horizontalSplitter_6.setObjectName(_fromUtf8("horizontalSplitter_6")) - self.inboxSearchLineEditChans = QtGui.QLineEdit(self.chans) - self.inboxSearchLineEditChans.setObjectName(_fromUtf8("inboxSearchLineEditChans")) - self.horizontalSplitter_6.addWidget(self.inboxSearchLineEditChans) - self.inboxSearchOptionChans = QtGui.QComboBox(self.chans) - self.inboxSearchOptionChans.setObjectName(_fromUtf8("inboxSearchOptionChans")) - self.inboxSearchOptionChans.addItem(_fromUtf8("")) - self.inboxSearchOptionChans.addItem(_fromUtf8("")) - self.inboxSearchOptionChans.addItem(_fromUtf8("")) - self.inboxSearchOptionChans.addItem(_fromUtf8("")) - self.inboxSearchOptionChans.addItem(_fromUtf8("")) - self.inboxSearchOptionChans.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContents) - self.inboxSearchOptionChans.setCurrentIndex(3) - self.horizontalSplitter_6.addWidget(self.inboxSearchOptionChans) - self.horizontalSplitter_6.handle(1).setEnabled(False) - self.horizontalSplitter_6.setStretchFactor(0, 1) - self.horizontalSplitter_6.setStretchFactor(1, 0) - self.verticalSplitter_8.addWidget(self.horizontalSplitter_6) - self.tableWidgetInboxChans = settingsmixin.STableWidget(self.chans) - self.tableWidgetInboxChans.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers) + self.verticalLayout_17.addWidget(self.treeWidgetChans) + self.pushButtonAddChan = QtWidgets.QPushButton(parent=self.tab_3) + self.pushButtonAddChan.setMaximumSize(QtCore.QSize(200, 16777215)) + self.pushButtonAddChan.setObjectName("pushButtonAddChan") + self.verticalLayout_17.addWidget(self.pushButtonAddChan) + self.horizontalLayout_7.addLayout(self.verticalLayout_17) + self.verticalLayout_8 = QtWidgets.QVBoxLayout() + self.verticalLayout_8.setObjectName("verticalLayout_8") + self.horizontalLayout_6 = QtWidgets.QHBoxLayout() + self.horizontalLayout_6.setObjectName("horizontalLayout_6") + self.inboxSearchLineEditChans = QtWidgets.QLineEdit(parent=self.tab_3) + self.inboxSearchLineEditChans.setObjectName("inboxSearchLineEditChans") + self.horizontalLayout_6.addWidget(self.inboxSearchLineEditChans) + self.inboxSearchOptionChans = QtWidgets.QComboBox(parent=self.tab_3) + self.inboxSearchOptionChans.setObjectName("inboxSearchOptionChans") + self.inboxSearchOptionChans.addItem("") + self.inboxSearchOptionChans.addItem("") + self.inboxSearchOptionChans.addItem("") + self.inboxSearchOptionChans.addItem("") + self.inboxSearchOptionChans.addItem("") + self.horizontalLayout_6.addWidget(self.inboxSearchOptionChans) + self.verticalLayout_8.addLayout(self.horizontalLayout_6) + self.tableWidgetInboxChans = QtWidgets.QTableWidget(parent=self.tab_3) + self.tableWidgetInboxChans.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers) self.tableWidgetInboxChans.setAlternatingRowColors(True) - self.tableWidgetInboxChans.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) - self.tableWidgetInboxChans.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows) + self.tableWidgetInboxChans.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.ExtendedSelection) + self.tableWidgetInboxChans.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows) self.tableWidgetInboxChans.setWordWrap(False) - self.tableWidgetInboxChans.setObjectName(_fromUtf8("tableWidgetInboxChans")) + self.tableWidgetInboxChans.setObjectName("tableWidgetInboxChans") self.tableWidgetInboxChans.setColumnCount(4) self.tableWidgetInboxChans.setRowCount(0) - item = QtGui.QTableWidgetItem() + item = QtWidgets.QTableWidgetItem() self.tableWidgetInboxChans.setHorizontalHeaderItem(0, item) - item = QtGui.QTableWidgetItem() + item = QtWidgets.QTableWidgetItem() self.tableWidgetInboxChans.setHorizontalHeaderItem(1, item) - item = QtGui.QTableWidgetItem() + item = QtWidgets.QTableWidgetItem() self.tableWidgetInboxChans.setHorizontalHeaderItem(2, item) - item = QtGui.QTableWidgetItem() + item = QtWidgets.QTableWidgetItem() self.tableWidgetInboxChans.setHorizontalHeaderItem(3, item) self.tableWidgetInboxChans.horizontalHeader().setCascadingSectionResizes(True) self.tableWidgetInboxChans.horizontalHeader().setDefaultSectionSize(200) @@ -550,97 +423,180 @@ def setupUi(self, MainWindow): self.tableWidgetInboxChans.horizontalHeader().setStretchLastSection(True) self.tableWidgetInboxChans.verticalHeader().setVisible(False) self.tableWidgetInboxChans.verticalHeader().setDefaultSectionSize(26) - self.verticalSplitter_8.addWidget(self.tableWidgetInboxChans) - self.textEditInboxMessageChans = MessageView(self.chans) + self.verticalLayout_8.addWidget(self.tableWidgetInboxChans) + self.textEditInboxMessageChans = QtWidgets.QTextEdit(parent=self.tab_3) self.textEditInboxMessageChans.setBaseSize(QtCore.QSize(0, 500)) self.textEditInboxMessageChans.setReadOnly(True) - self.textEditInboxMessageChans.setObjectName(_fromUtf8("textEditInboxMessageChans")) - self.verticalSplitter_8.addWidget(self.textEditInboxMessageChans) - self.verticalSplitter_8.setStretchFactor(0, 0) - self.verticalSplitter_8.setStretchFactor(1, 1) - self.verticalSplitter_8.setStretchFactor(2, 2) - self.verticalSplitter_8.setCollapsible(0, False) - self.verticalSplitter_8.setCollapsible(1, False) - self.verticalSplitter_8.setCollapsible(2, False) - self.verticalSplitter_8.handle(1).setEnabled(False) - self.horizontalSplitter_7.addWidget(self.verticalSplitter_8) - self.horizontalSplitter_7.setStretchFactor(0, 0) - self.horizontalSplitter_7.setStretchFactor(1, 1) - self.horizontalSplitter_7.setCollapsible(0, False) - self.horizontalSplitter_7.setCollapsible(1, False) - self.gridLayout_4.addWidget(self.horizontalSplitter_7, 0, 0, 1, 1) + self.textEditInboxMessageChans.setObjectName("textEditInboxMessageChans") + self.verticalLayout_8.addWidget(self.textEditInboxMessageChans) + self.horizontalLayout_7.addLayout(self.verticalLayout_8) + self.gridLayout_4.addLayout(self.horizontalLayout_7, 0, 0, 1, 1) icon8 = QtGui.QIcon() - icon8.addPixmap( - QtGui.QPixmap(_fromUtf8(":/newPrefix/images/can-icon-16px.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off - ) - self.tabWidget.addTab(self.chans, icon8, _fromUtf8("")) - self.blackwhitelist = Blacklist() - self.tabWidget.addTab(self.blackwhitelist, QtGui.QIcon(":/newPrefix/images/blacklist.png"), "") - # Initialize the Blacklist or Whitelist - if config.get('bitmessagesettings', 'blackwhitelist') == 'white': - self.blackwhitelist.radioButtonWhitelist.click() - self.blackwhitelist.rerenderBlackWhiteList() - - self.networkstatus = NetworkStatus() - self.tabWidget.addTab(self.networkstatus, QtGui.QIcon(":/newPrefix/images/networkstatus.png"), "") + icon8.addPixmap(QtGui.QPixmap(":/newPrefix/images/can-icon-16px.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.tabWidget.addTab(self.tab_3, icon8, "") + self.blackwhitelist = QtWidgets.QWidget() + self.blackwhitelist.setObjectName("blackwhitelist") + self.gridLayout_6 = QtWidgets.QGridLayout(self.blackwhitelist) + self.gridLayout_6.setObjectName("gridLayout_6") + self.radioButtonBlacklist = QtWidgets.QRadioButton(parent=self.blackwhitelist) + self.radioButtonBlacklist.setChecked(True) + self.radioButtonBlacklist.setObjectName("radioButtonBlacklist") + self.gridLayout_6.addWidget(self.radioButtonBlacklist, 0, 0, 1, 2) + self.radioButtonWhitelist = QtWidgets.QRadioButton(parent=self.blackwhitelist) + self.radioButtonWhitelist.setObjectName("radioButtonWhitelist") + self.gridLayout_6.addWidget(self.radioButtonWhitelist, 1, 0, 1, 2) + self.pushButtonAddBlacklist = QtWidgets.QPushButton(parent=self.blackwhitelist) + self.pushButtonAddBlacklist.setObjectName("pushButtonAddBlacklist") + self.gridLayout_6.addWidget(self.pushButtonAddBlacklist, 2, 0, 1, 1) + spacerItem = QtWidgets.QSpacerItem(689, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.gridLayout_6.addItem(spacerItem, 2, 1, 1, 1) + self.tableWidgetBlacklist = QtWidgets.QTableWidget(parent=self.blackwhitelist) + self.tableWidgetBlacklist.setAlternatingRowColors(True) + self.tableWidgetBlacklist.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.SingleSelection) + self.tableWidgetBlacklist.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows) + self.tableWidgetBlacklist.setObjectName("tableWidgetBlacklist") + self.tableWidgetBlacklist.setColumnCount(2) + self.tableWidgetBlacklist.setRowCount(0) + item = QtWidgets.QTableWidgetItem() + self.tableWidgetBlacklist.setHorizontalHeaderItem(0, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidgetBlacklist.setHorizontalHeaderItem(1, item) + self.tableWidgetBlacklist.horizontalHeader().setCascadingSectionResizes(True) + self.tableWidgetBlacklist.horizontalHeader().setDefaultSectionSize(400) + self.tableWidgetBlacklist.horizontalHeader().setHighlightSections(False) + self.tableWidgetBlacklist.horizontalHeader().setSortIndicatorShown(False) + self.tableWidgetBlacklist.horizontalHeader().setStretchLastSection(True) + self.tableWidgetBlacklist.verticalHeader().setVisible(False) + self.gridLayout_6.addWidget(self.tableWidgetBlacklist, 3, 0, 1, 2) + icon9 = QtGui.QIcon() + icon9.addPixmap(QtGui.QPixmap(":/newPrefix/images/blacklist.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.tabWidget.addTab(self.blackwhitelist, icon9, "") + self.networkstatus = QtWidgets.QWidget() + self.networkstatus.setObjectName("networkstatus") + self.pushButtonStatusIcon = QtWidgets.QPushButton(parent=self.networkstatus) + self.pushButtonStatusIcon.setGeometry(QtCore.QRect(680, 440, 21, 23)) + self.pushButtonStatusIcon.setText("") + icon10 = QtGui.QIcon() + icon10.addPixmap(QtGui.QPixmap(":/newPrefix/images/redicon.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.pushButtonStatusIcon.setIcon(icon10) + self.pushButtonStatusIcon.setFlat(True) + self.pushButtonStatusIcon.setObjectName("pushButtonStatusIcon") + self.tableWidgetConnectionCount = QtWidgets.QTableWidget(parent=self.networkstatus) + self.tableWidgetConnectionCount.setGeometry(QtCore.QRect(20, 70, 241, 241)) + palette = QtGui.QPalette() + brush = QtGui.QBrush(QtGui.QColor(212, 208, 200)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Active, QtGui.QPalette.ColorRole.Base, brush) + brush = QtGui.QBrush(QtGui.QColor(212, 208, 200)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Inactive, QtGui.QPalette.ColorRole.Base, brush) + brush = QtGui.QBrush(QtGui.QColor(212, 208, 200)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.Base, brush) + self.tableWidgetConnectionCount.setPalette(palette) + self.tableWidgetConnectionCount.setFrameShape(QtWidgets.QFrame.Shape.Box) + self.tableWidgetConnectionCount.setFrameShadow(QtWidgets.QFrame.Shadow.Plain) + self.tableWidgetConnectionCount.setProperty("showDropIndicator", False) + self.tableWidgetConnectionCount.setAlternatingRowColors(True) + self.tableWidgetConnectionCount.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.NoSelection) + self.tableWidgetConnectionCount.setObjectName("tableWidgetConnectionCount") + self.tableWidgetConnectionCount.setColumnCount(2) + self.tableWidgetConnectionCount.setRowCount(0) + item = QtWidgets.QTableWidgetItem() + self.tableWidgetConnectionCount.setHorizontalHeaderItem(0, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidgetConnectionCount.setHorizontalHeaderItem(1, item) + self.tableWidgetConnectionCount.horizontalHeader().setCascadingSectionResizes(True) + self.tableWidgetConnectionCount.horizontalHeader().setHighlightSections(False) + self.tableWidgetConnectionCount.horizontalHeader().setStretchLastSection(True) + self.tableWidgetConnectionCount.verticalHeader().setVisible(False) + self.labelTotalConnections = QtWidgets.QLabel(parent=self.networkstatus) + self.labelTotalConnections.setGeometry(QtCore.QRect(20, 30, 401, 16)) + self.labelTotalConnections.setObjectName("labelTotalConnections") + self.labelStartupTime = QtWidgets.QLabel(parent=self.networkstatus) + self.labelStartupTime.setGeometry(QtCore.QRect(320, 110, 331, 20)) + self.labelStartupTime.setObjectName("labelStartupTime") + self.labelMessageCount = QtWidgets.QLabel(parent=self.networkstatus) + self.labelMessageCount.setGeometry(QtCore.QRect(350, 130, 361, 16)) + self.labelMessageCount.setObjectName("labelMessageCount") + self.labelPubkeyCount = QtWidgets.QLabel(parent=self.networkstatus) + self.labelPubkeyCount.setGeometry(QtCore.QRect(350, 170, 331, 16)) + self.labelPubkeyCount.setObjectName("labelPubkeyCount") + self.labelBroadcastCount = QtWidgets.QLabel(parent=self.networkstatus) + self.labelBroadcastCount.setGeometry(QtCore.QRect(350, 150, 351, 16)) + self.labelBroadcastCount.setObjectName("labelBroadcastCount") + self.labelLookupsPerSecond = QtWidgets.QLabel(parent=self.networkstatus) + self.labelLookupsPerSecond.setGeometry(QtCore.QRect(320, 250, 291, 16)) + self.labelLookupsPerSecond.setObjectName("labelLookupsPerSecond") + self.labelBytesRecvCount = QtWidgets.QLabel(parent=self.networkstatus) + self.labelBytesRecvCount.setGeometry(QtCore.QRect(350, 210, 251, 16)) + self.labelBytesRecvCount.setObjectName("labelBytesRecvCount") + self.labelBytesSentCount = QtWidgets.QLabel(parent=self.networkstatus) + self.labelBytesSentCount.setGeometry(QtCore.QRect(350, 230, 251, 16)) + self.labelBytesSentCount.setObjectName("labelBytesSentCount") + icon11 = QtGui.QIcon() + icon11.addPixmap(QtGui.QPixmap(":/newPrefix/images/networkstatus.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.tabWidget.addTab(self.networkstatus, icon11, "") self.gridLayout_10.addWidget(self.tabWidget, 0, 0, 1, 1) - MainWindow.setCentralWidget(self.centralwidget) - self.menubar = QtGui.QMenuBar(MainWindow) + self.MainDock.setWidget(self.centralwidget) + # XXX unresolved + #MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(None), self.MainDock) + self.menubar = QtWidgets.QMenuBar(parent=MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 885, 27)) - self.menubar.setObjectName(_fromUtf8("menubar")) - self.menuFile = QtGui.QMenu(self.menubar) - self.menuFile.setObjectName(_fromUtf8("menuFile")) - self.menuSettings = QtGui.QMenu(self.menubar) - self.menuSettings.setObjectName(_fromUtf8("menuSettings")) - self.menuHelp = QtGui.QMenu(self.menubar) - self.menuHelp.setObjectName(_fromUtf8("menuHelp")) + self.menubar.setObjectName("menubar") + self.menuFile = QtWidgets.QMenu(parent=self.menubar) + self.menuFile.setObjectName("menuFile") + self.menuSettings = QtWidgets.QMenu(parent=self.menubar) + self.menuSettings.setObjectName("menuSettings") + self.menuHelp = QtWidgets.QMenu(parent=self.menubar) + self.menuHelp.setObjectName("menuHelp") MainWindow.setMenuBar(self.menubar) - self.statusbar = QtGui.QStatusBar(MainWindow) + self.statusbar = QtWidgets.QStatusBar(parent=MainWindow) self.statusbar.setMaximumSize(QtCore.QSize(16777215, 22)) - self.statusbar.setObjectName(_fromUtf8("statusbar")) + self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) - self.actionImport_keys = QtGui.QAction(MainWindow) - self.actionImport_keys.setObjectName(_fromUtf8("actionImport_keys")) - self.actionManageKeys = QtGui.QAction(MainWindow) + self.actionImport_keys = QtGui.QAction(parent=MainWindow) + self.actionImport_keys.setObjectName("actionImport_keys") + self.actionManageKeys = QtGui.QAction(parent=MainWindow) self.actionManageKeys.setCheckable(False) self.actionManageKeys.setEnabled(True) - icon = QtGui.QIcon.fromTheme(_fromUtf8("dialog-password")) + self.actionNetworkSwitch = QtGui.QAction(parent=MainWindow) + self.actionNetworkSwitch.setObjectName("actionNetworkSwitch") + icon = QtGui.QIcon.fromTheme("dialog-password") self.actionManageKeys.setIcon(icon) - self.actionManageKeys.setObjectName(_fromUtf8("actionManageKeys")) - self.actionNetworkSwitch = QtGui.QAction(MainWindow) - self.actionNetworkSwitch.setObjectName(_fromUtf8("actionNetworkSwitch")) - self.actionExit = QtGui.QAction(MainWindow) - icon = QtGui.QIcon.fromTheme(_fromUtf8("application-exit")) + self.actionManageKeys.setObjectName("actionManageKeys") + self.actionExit = QtGui.QAction(parent=MainWindow) + icon = QtGui.QIcon.fromTheme("application-exit") self.actionExit.setIcon(icon) - self.actionExit.setObjectName(_fromUtf8("actionExit")) - self.actionHelp = QtGui.QAction(MainWindow) - icon = QtGui.QIcon.fromTheme(_fromUtf8("help-contents")) + self.actionExit.setObjectName("actionExit") + self.actionHelp = QtGui.QAction(parent=MainWindow) + icon = QtGui.QIcon.fromTheme("help-contents") self.actionHelp.setIcon(icon) - self.actionHelp.setObjectName(_fromUtf8("actionHelp")) + self.actionHelp.setObjectName("actionHelp") self.actionSupport = QtGui.QAction(MainWindow) - icon = QtGui.QIcon.fromTheme(_fromUtf8("help-support")) + icon = QtGui.QIcon.fromTheme("help-support") self.actionSupport.setIcon(icon) - self.actionSupport.setObjectName(_fromUtf8("actionSupport")) - self.actionAbout = QtGui.QAction(MainWindow) - icon = QtGui.QIcon.fromTheme(_fromUtf8("help-about")) + self.actionSupport.setObjectName("actionSupport") + self.actionAbout = QtGui.QAction(parent=MainWindow) + icon = QtGui.QIcon.fromTheme("help-about") self.actionAbout.setIcon(icon) - self.actionAbout.setObjectName(_fromUtf8("actionAbout")) - self.actionSettings = QtGui.QAction(MainWindow) - icon = QtGui.QIcon.fromTheme(_fromUtf8("document-properties")) + self.actionAbout.setObjectName("actionAbout") + self.actionSettings = QtGui.QAction(parent=MainWindow) + icon = QtGui.QIcon.fromTheme("document-properties") self.actionSettings.setIcon(icon) - self.actionSettings.setObjectName(_fromUtf8("actionSettings")) - self.actionRegenerateDeterministicAddresses = QtGui.QAction(MainWindow) - icon = QtGui.QIcon.fromTheme(_fromUtf8("view-refresh")) + self.actionSettings.setObjectName("actionSettings") + self.actionRegenerateDeterministicAddresses = QtGui.QAction(parent=MainWindow) + icon = QtGui.QIcon.fromTheme("view-refresh") self.actionRegenerateDeterministicAddresses.setIcon(icon) - self.actionRegenerateDeterministicAddresses.setObjectName(_fromUtf8("actionRegenerateDeterministicAddresses")) - self.actionDeleteAllTrashedMessages = QtGui.QAction(MainWindow) - icon = QtGui.QIcon.fromTheme(_fromUtf8("user-trash")) + self.actionRegenerateDeterministicAddresses.setObjectName("actionRegenerateDeterministicAddresses") + self.actionDeleteAllTrashedMessages = QtGui.QAction(parent=MainWindow) + icon = QtGui.QIcon.fromTheme("user-trash") self.actionDeleteAllTrashedMessages.setIcon(icon) - self.actionDeleteAllTrashedMessages.setObjectName(_fromUtf8("actionDeleteAllTrashedMessages")) - self.actionJoinChan = QtGui.QAction(MainWindow) - icon = QtGui.QIcon.fromTheme(_fromUtf8("contact-new")) + self.actionDeleteAllTrashedMessages.setObjectName("actionDeleteAllTrashedMessages") + self.actionJoinChan = QtGui.QAction(parent=MainWindow) + icon = QtGui.QIcon.fromTheme("contact-new") self.actionJoinChan.setIcon(icon) - self.actionJoinChan.setObjectName(_fromUtf8("actionJoinChan")) + self.actionJoinChan.setObjectName("actionJoinChan") self.menuFile.addAction(self.actionManageKeys) self.menuFile.addAction(self.actionDeleteAllTrashedMessages) self.menuFile.addAction(self.actionRegenerateDeterministicAddresses) @@ -655,30 +611,34 @@ def setupUi(self, MainWindow): self.menubar.addAction(self.menuHelp.menuAction()) self.retranslateUi(MainWindow) - self.tabWidget.setCurrentIndex( - self.tabWidget.indexOf(self.inbox) - ) - self.tabWidgetSend.setCurrentIndex( - self.tabWidgetSend.indexOf(self.sendDirect) - ) + self.tabWidget.setCurrentIndex(0) + self.tabWidgetSend.setCurrentIndex(0) QtCore.QMetaObject.connectSlotsByName(MainWindow) MainWindow.setTabOrder(self.tableWidgetInbox, self.textEditInboxMessage) MainWindow.setTabOrder(self.textEditInboxMessage, self.comboBoxSendFrom) MainWindow.setTabOrder(self.comboBoxSendFrom, self.lineEditTo) MainWindow.setTabOrder(self.lineEditTo, self.lineEditSubject) MainWindow.setTabOrder(self.lineEditSubject, self.textEditMessage) - MainWindow.setTabOrder(self.textEditMessage, self.pushButtonAddSubscription) + MainWindow.setTabOrder(self.textEditMessage, self.pushButtonSend) + MainWindow.setTabOrder(self.pushButtonSend, self.pushButtonAddSubscription) + MainWindow.setTabOrder(self.pushButtonAddSubscription, self.radioButtonBlacklist) + MainWindow.setTabOrder(self.radioButtonBlacklist, self.radioButtonWhitelist) + MainWindow.setTabOrder(self.radioButtonWhitelist, self.pushButtonAddBlacklist) + MainWindow.setTabOrder(self.pushButtonAddBlacklist, self.tableWidgetBlacklist) + MainWindow.setTabOrder(self.tableWidgetBlacklist, self.tableWidgetConnectionCount) + MainWindow.setTabOrder(self.tableWidgetConnectionCount, self.pushButtonStatusIcon) # Popup menu actions container for the Sent page # pylint: disable=attribute-defined-outside-init - self.sentContextMenuToolbar = QtGui.QToolBar() + self.sentContextMenuToolbar = QtWidgets.QToolBar() # Popup menu actions container for chans tree - self.addressContextMenuToolbar = QtGui.QToolBar() + self.addressContextMenuToolbar = QtWidgets.QToolBar() # Popup menu actions container for subscriptions tree - self.subscriptionsContextMenuToolbar = QtGui.QToolBar() + self.subscriptionsContextMenuToolbar = QtWidgets.QToolBar() def updateNetworkSwitchMenuLabel(self, dontconnect=None): if dontconnect is None: + _translate = QtCore.QCoreApplication.translate dontconnect = config.safeGetBoolean( 'bitmessagesettings', 'dontconnect') self.actionNetworkSwitch.setText( @@ -688,130 +648,126 @@ def updateNetworkSwitchMenuLabel(self, dontconnect=None): ) def retranslateUi(self, MainWindow): - MainWindow.setWindowTitle(_translate("MainWindow", "Bitmessage", None)) - self.treeWidgetYourIdentities.headerItem().setText(0, _translate("MainWindow", "Identities", None)) - self.pushButtonNewAddress.setText(_translate("MainWindow", "New Identity", None)) - self.inboxSearchLineEdit.setPlaceholderText(_translate("MainWindow", "Search", None)) - self.inboxSearchOption.setItemText(0, _translate("MainWindow", "All", None)) - self.inboxSearchOption.setItemText(1, _translate("MainWindow", "To", None)) - self.inboxSearchOption.setItemText(2, _translate("MainWindow", "From", None)) - self.inboxSearchOption.setItemText(3, _translate("MainWindow", "Subject", None)) - self.inboxSearchOption.setItemText(4, _translate("MainWindow", "Message", None)) + _translate = QtCore.QCoreApplication.translate + self.MainDock.setWindowTitle(_translate("MainWindow", "Bitmessage")) + self.treeWidgetYourIdentities.headerItem().setText(0, _translate("MainWindow", "Identities")) + self.pushButtonNewAddress.setText(_translate("MainWindow", "New Indentitiy")) + self.inboxSearchLineEdit.setPlaceholderText(_translate("MainWindow", "Search")) + self.inboxSearchOption.setItemText(0, _translate("MainWindow", "All")) + self.inboxSearchOption.setItemText(1, _translate("MainWindow", "To")) + self.inboxSearchOption.setItemText(2, _translate("MainWindow", "From")) + self.inboxSearchOption.setItemText(3, _translate("MainWindow", "Subject")) + self.inboxSearchOption.setItemText(4, _translate("MainWindow", "Message")) self.tableWidgetInbox.setSortingEnabled(True) item = self.tableWidgetInbox.horizontalHeaderItem(0) - item.setText(_translate("MainWindow", "To", None)) + item.setText(_translate("MainWindow", "To")) item = self.tableWidgetInbox.horizontalHeaderItem(1) - item.setText(_translate("MainWindow", "From", None)) + item.setText(_translate("MainWindow", "From")) item = self.tableWidgetInbox.horizontalHeaderItem(2) - item.setText(_translate("MainWindow", "Subject", None)) + item.setText(_translate("MainWindow", "Subject")) item = self.tableWidgetInbox.horizontalHeaderItem(3) - item.setText(_translate("MainWindow", "Received", None)) - self.tabWidget.setTabText(self.tabWidget.indexOf(self.inbox), _translate("MainWindow", "Messages", None)) + item.setText(_translate("MainWindow", "Received")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.inbox), _translate("MainWindow", "Messages")) self.tableWidgetAddressBook.setSortingEnabled(True) item = self.tableWidgetAddressBook.horizontalHeaderItem(0) - item.setText(_translate("MainWindow", "Address book", None)) + item.setText(_translate("MainWindow", "Address book")) item = self.tableWidgetAddressBook.horizontalHeaderItem(1) - item.setText(_translate("MainWindow", "Address", None)) - self.pushButtonAddAddressBook.setText(_translate("MainWindow", "Add Contact", None)) - self.pushButtonFetchNamecoinID.setText(_translate("MainWindow", "Fetch Namecoin ID", None)) - self.label_3.setText(_translate("MainWindow", "Subject:", None)) - self.label_2.setText(_translate("MainWindow", "From:", None)) - self.label.setText(_translate("MainWindow", "To:", None)) - self.tabWidgetSend.setTabText( - self.tabWidgetSend.indexOf(self.sendDirect), _translate("MainWindow", "Send ordinary Message", None) - ) - self.label_8.setText(_translate("MainWindow", "From:", None)) - self.label_7.setText(_translate("MainWindow", "Subject:", None)) - self.tabWidgetSend.setTabText( - self.tabWidgetSend.indexOf(self.sendBroadcast), - _translate("MainWindow", "Send Message to your Subscribers", None) - ) - self.pushButtonTTL.setText(_translate("MainWindow", "TTL:", None)) - hours = 48 - try: - hours = int(config.getint('bitmessagesettings', 'ttl') / 60 / 60) - except: - pass - self.labelHumanFriendlyTTLDescription.setText( - _translate("MainWindow", "%n hour(s)", None, QtCore.QCoreApplication.CodecForTr, hours) - ) - self.pushButtonClear.setText(_translate("MainWindow", "Clear", None)) - self.pushButtonSend.setText(_translate("MainWindow", "Send", None)) - self.tabWidget.setTabText(self.tabWidget.indexOf(self.send), _translate("MainWindow", "Send", None)) - self.treeWidgetSubscriptions.headerItem().setText(0, _translate("MainWindow", "Subscriptions", None)) - self.pushButtonAddSubscription.setText(_translate("MainWindow", "Add new Subscription", None)) - self.inboxSearchLineEditSubscriptions.setPlaceholderText(_translate("MainWindow", "Search", None)) - self.inboxSearchOptionSubscriptions.setItemText(0, _translate("MainWindow", "All", None)) - self.inboxSearchOptionSubscriptions.setItemText(1, _translate("MainWindow", "From", None)) - self.inboxSearchOptionSubscriptions.setItemText(2, _translate("MainWindow", "Subject", None)) - self.inboxSearchOptionSubscriptions.setItemText(3, _translate("MainWindow", "Message", None)) + item.setText(_translate("MainWindow", "Address")) + self.pushButtonAddAddressBook.setText(_translate("MainWindow", "Add Contact")) + self.pushButtonFetchNamecoinID.setText(_translate("MainWindow", "Fetch Namecoin ID")) + self.label_3.setText(_translate("MainWindow", "Subject:")) + self.label_2.setText(_translate("MainWindow", "From:")) + self.label.setText(_translate("MainWindow", "To:")) + self.textEditMessage.setHtml(_translate("MainWindow", "\n" +"\n" +"


")) + self.tabWidgetSend.setTabText(self.tabWidgetSend.indexOf(self.tab), _translate("MainWindow", "Send ordinary Message")) + self.label_8.setText(_translate("MainWindow", "From:")) + self.label_7.setText(_translate("MainWindow", "Subject:")) + self.textEditMessageBroadcast.setHtml(_translate("MainWindow", "\n" +"\n" +"


")) + self.tabWidgetSend.setTabText(self.tabWidgetSend.indexOf(self.tab_2), _translate("MainWindow", "Send Message to your Subscribers")) + self.pushButtonTTL.setText(_translate("MainWindow", "TTL:")) + self.labelHumanFriendlyTTLDescription.setText(_translate("MainWindow", "X days")) + self.pushButtonClear.setText(_translate("MainWindow", "Clear")) + self.pushButtonSend.setText(_translate("MainWindow", "Send")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.send), _translate("MainWindow", "Send")) + self.treeWidgetSubscriptions.headerItem().setText(0, _translate("MainWindow", "Subscriptions")) + self.pushButtonAddSubscription.setText(_translate("MainWindow", "Add new Subscription")) + self.inboxSearchLineEditSubscriptions.setPlaceholderText(_translate("MainWindow", "Search")) + self.inboxSearchOptionSubscriptions.setItemText(0, _translate("MainWindow", "All")) + self.inboxSearchOptionSubscriptions.setItemText(1, _translate("MainWindow", "To")) + self.inboxSearchOptionSubscriptions.setItemText(2, _translate("MainWindow", "From")) + self.inboxSearchOptionSubscriptions.setItemText(3, _translate("MainWindow", "Subject")) + self.inboxSearchOptionSubscriptions.setItemText(4, _translate("MainWindow", "Message")) self.tableWidgetInboxSubscriptions.setSortingEnabled(True) item = self.tableWidgetInboxSubscriptions.horizontalHeaderItem(0) - item.setText(_translate("MainWindow", "To", None)) + item.setText(_translate("MainWindow", "To")) item = self.tableWidgetInboxSubscriptions.horizontalHeaderItem(1) - item.setText(_translate("MainWindow", "From", None)) + item.setText(_translate("MainWindow", "From")) item = self.tableWidgetInboxSubscriptions.horizontalHeaderItem(2) - item.setText(_translate("MainWindow", "Subject", None)) + item.setText(_translate("MainWindow", "Subject")) item = self.tableWidgetInboxSubscriptions.horizontalHeaderItem(3) - item.setText(_translate("MainWindow", "Received", None)) - self.tabWidget.setTabText( - self.tabWidget.indexOf(self.subscriptions), - _translate("MainWindow", "Subscriptions", None) - ) - self.treeWidgetChans.headerItem().setText(0, _translate("MainWindow", "Chans", None)) - self.pushButtonAddChan.setText(_translate("MainWindow", "Add Chan", None)) - self.inboxSearchLineEditChans.setPlaceholderText(_translate("MainWindow", "Search", None)) - self.inboxSearchOptionChans.setItemText(0, _translate("MainWindow", "All", None)) - self.inboxSearchOptionChans.setItemText(1, _translate("MainWindow", "To", None)) - self.inboxSearchOptionChans.setItemText(2, _translate("MainWindow", "From", None)) - self.inboxSearchOptionChans.setItemText(3, _translate("MainWindow", "Subject", None)) - self.inboxSearchOptionChans.setItemText(4, _translate("MainWindow", "Message", None)) + item.setText(_translate("MainWindow", "Received")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.subscriptions), _translate("MainWindow", "Subscriptions")) + self.treeWidgetChans.headerItem().setText(0, _translate("MainWindow", "Chans")) + self.pushButtonAddChan.setText(_translate("MainWindow", "Add Chan")) + self.inboxSearchLineEditChans.setPlaceholderText(_translate("MainWindow", "Search")) + self.inboxSearchOptionChans.setItemText(0, _translate("MainWindow", "All")) + self.inboxSearchOptionChans.setItemText(1, _translate("MainWindow", "To")) + self.inboxSearchOptionChans.setItemText(2, _translate("MainWindow", "From")) + self.inboxSearchOptionChans.setItemText(3, _translate("MainWindow", "Subject")) + self.inboxSearchOptionChans.setItemText(4, _translate("MainWindow", "Message")) self.tableWidgetInboxChans.setSortingEnabled(True) item = self.tableWidgetInboxChans.horizontalHeaderItem(0) - item.setText(_translate("MainWindow", "To", None)) + item.setText(_translate("MainWindow", "To")) item = self.tableWidgetInboxChans.horizontalHeaderItem(1) - item.setText(_translate("MainWindow", "From", None)) + item.setText(_translate("MainWindow", "From")) item = self.tableWidgetInboxChans.horizontalHeaderItem(2) - item.setText(_translate("MainWindow", "Subject", None)) + item.setText(_translate("MainWindow", "Subject")) item = self.tableWidgetInboxChans.horizontalHeaderItem(3) - item.setText(_translate("MainWindow", "Received", None)) - self.tabWidget.setTabText(self.tabWidget.indexOf(self.chans), _translate("MainWindow", "Chans", None)) - self.blackwhitelist.retranslateUi() - self.tabWidget.setTabText( - self.tabWidget.indexOf(self.blackwhitelist), - _translate("blacklist", "Blacklist", None) - ) - self.networkstatus.retranslateUi() - self.tabWidget.setTabText( - self.tabWidget.indexOf(self.networkstatus), - _translate("networkstatus", "Network Status", None) - ) - self.menuFile.setTitle(_translate("MainWindow", "File", None)) - self.menuSettings.setTitle(_translate("MainWindow", "Settings", None)) - self.menuHelp.setTitle(_translate("MainWindow", "Help", None)) - self.actionImport_keys.setText(_translate("MainWindow", "Import keys", None)) - self.actionManageKeys.setText(_translate("MainWindow", "Manage keys", None)) - self.actionExit.setText(_translate("MainWindow", "Quit", None)) - self.actionExit.setShortcut(_translate("MainWindow", "Ctrl+Q", None)) - self.actionHelp.setText(_translate("MainWindow", "Help", None)) - self.actionHelp.setShortcut(_translate("MainWindow", "F1", None)) - self.actionSupport.setText(_translate("MainWindow", "Contact support", None)) - self.actionAbout.setText(_translate("MainWindow", "About", None)) - self.actionSettings.setText(_translate("MainWindow", "Settings", None)) - self.actionRegenerateDeterministicAddresses.setText( - _translate("MainWindow", "Regenerate deterministic addresses", None) - ) - self.actionDeleteAllTrashedMessages.setText(_translate("MainWindow", "Delete all trashed messages", None)) - self.actionJoinChan.setText(_translate("MainWindow", "Join / Create chan", None)) + item.setText(_translate("MainWindow", "Received")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), _translate("MainWindow", "Chans")) + self.radioButtonBlacklist.setText(_translate("MainWindow", "Use a Blacklist (Allow all incoming messages except those on the Blacklist)")) + self.radioButtonWhitelist.setText(_translate("MainWindow", "Use a Whitelist (Block all incoming messages except those on the Whitelist)")) + self.pushButtonAddBlacklist.setText(_translate("MainWindow", "Add new entry")) + self.tableWidgetBlacklist.setSortingEnabled(True) + item = self.tableWidgetBlacklist.horizontalHeaderItem(0) + item.setText(_translate("MainWindow", "Name or Label")) + item = self.tableWidgetBlacklist.horizontalHeaderItem(1) + item.setText(_translate("MainWindow", "Address")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.blackwhitelist), _translate("MainWindow", "Blacklist")) + item = self.tableWidgetConnectionCount.horizontalHeaderItem(0) + item.setText(_translate("MainWindow", "Stream #")) + item = self.tableWidgetConnectionCount.horizontalHeaderItem(1) + item.setText(_translate("MainWindow", "Connections")) + self.labelTotalConnections.setText(_translate("MainWindow", "Total connections:")) + self.labelStartupTime.setText(_translate("MainWindow", "Since startup:")) + self.labelMessageCount.setText(_translate("MainWindow", "Processed 0 person-to-person messages.")) + self.labelPubkeyCount.setText(_translate("MainWindow", "Processed 0 public keys.")) + self.labelBroadcastCount.setText(_translate("MainWindow", "Processed 0 broadcasts.")) + self.labelLookupsPerSecond.setText(_translate("MainWindow", "Inventory lookups per second: 0")) + self.labelBytesRecvCount.setText(_translate("MainWindow", "Down: 0 KB/s")) + self.labelBytesSentCount.setText(_translate("MainWindow", "Up: 0 KB/s")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.networkstatus), _translate("MainWindow", "Network Status")) + self.menuFile.setTitle(_translate("MainWindow", "File")) + self.menuSettings.setTitle(_translate("MainWindow", "Settings")) + self.menuHelp.setTitle(_translate("MainWindow", "Help")) + self.actionImport_keys.setText(_translate("MainWindow", "Import keys")) + self.actionManageKeys.setText(_translate("MainWindow", "Manage keys")) + self.actionExit.setText(_translate("MainWindow", "Quit")) + self.actionExit.setShortcut(_translate("MainWindow", "Ctrl+Q")) + self.actionHelp.setText(_translate("MainWindow", "Help")) + self.actionHelp.setShortcut(_translate("MainWindow", "F1")) + self.actionSupport.setText(_translate("MainWindow", "Contact support")) + self.actionAbout.setText(_translate("MainWindow", "About")) + self.actionSettings.setText(_translate("MainWindow", "Settings")) + self.actionRegenerateDeterministicAddresses.setText(_translate("MainWindow", "Regenerate deterministic addresses")) + self.actionDeleteAllTrashedMessages.setText(_translate("MainWindow", "Delete all trashed messages")) + self.actionJoinChan.setText(_translate("MainWindow", "Join / Create chan")) self.updateNetworkSwitchMenuLabel() - - -if __name__ == "__main__": - import sys - - app = QtGui.QApplication(sys.argv) - MainWindow = settingsmixin.SMainWindow() - ui = Ui_MainWindow() - ui.setupUi(MainWindow) - MainWindow.show() - sys.exit(app.exec_()) diff --git a/src/bitmessageqt/bitmessageui.py.orig b/src/bitmessageqt/bitmessageui.py.orig new file mode 100644 index 0000000000..f6c1de6256 --- /dev/null +++ b/src/bitmessageqt/bitmessageui.py.orig @@ -0,0 +1,732 @@ +# Form implementation generated from reading ui file 'bitmessageui.ui' +# +# Created by: PyQt6 UI code generator 6.4.2 +# +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt6 import QtCore, QtGui, QtWidgets + + +class Ui_MainWindow(object): + def setupUi(self, MainWindow): + MainWindow.setObjectName("MainWindow") + self.MainDock = QtWidgets.QDockWidget(parent=MainWindow) + self.MainDock.setGeometry(QtCore.QRect(0, 0, 885, 580)) + icon = QtGui.QIcon() + icon.addPixmap(QtGui.QPixmap(":/newPrefix/images/can-icon-24px.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.MainDock.setWindowIcon(icon) + self.MainDock.setObjectName("MainDock") + self.centralwidget = QtWidgets.QWidget() + self.centralwidget.setObjectName("centralwidget") + self.gridLayout_10 = QtWidgets.QGridLayout(self.centralwidget) + self.gridLayout_10.setObjectName("gridLayout_10") + self.tabWidget = QtWidgets.QTabWidget(parent=self.centralwidget) + self.tabWidget.setTabShape(QtWidgets.QTabWidget.TabShape.Rounded) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.tabWidget.sizePolicy().hasHeightForWidth()) + self.tabWidget.setSizePolicy(sizePolicy) + self.tabWidget.setMinimumSize(QtCore.QSize(0, 0)) + self.tabWidget.setBaseSize(QtCore.QSize(0, 0)) + font = QtGui.QFont() + font.setPointSize(9) + self.tabWidget.setFont(font) + self.tabWidget.setTabPosition(QtWidgets.QTabWidget.TabPosition.North) + self.tabWidget.setTabShape(QtWidgets.QTabWidget.TabShape.Rounded) + self.tabWidget.setObjectName("tabWidget") + self.inbox = QtWidgets.QWidget() + self.inbox.setObjectName("inbox") + self.gridLayout = QtWidgets.QGridLayout(self.inbox) + self.gridLayout.setObjectName("gridLayout") + self.horizontalLayout_3 = QtWidgets.QHBoxLayout() + self.horizontalLayout_3.setObjectName("horizontalLayout_3") + self.verticalLayout_12 = QtWidgets.QVBoxLayout() + self.verticalLayout_12.setObjectName("verticalLayout_12") + self.treeWidgetYourIdentities = QtWidgets.QTreeWidget(parent=self.inbox) + self.treeWidgetYourIdentities.setMaximumSize(QtCore.QSize(200, 16777215)) + self.treeWidgetYourIdentities.setObjectName("treeWidgetYourIdentities") + icon1 = QtGui.QIcon() + icon1.addPixmap(QtGui.QPixmap(":/newPrefix/images/identities.png"), QtGui.QIcon.Mode.Selected, QtGui.QIcon.State.Off) + self.treeWidgetYourIdentities.headerItem().setIcon(0, icon1) + self.verticalLayout_12.addWidget(self.treeWidgetYourIdentities) + self.pushButtonNewAddress = QtWidgets.QPushButton(parent=self.inbox) + self.pushButtonNewAddress.setMaximumSize(QtCore.QSize(200, 16777215)) + self.pushButtonNewAddress.setObjectName("pushButtonNewAddress") + self.verticalLayout_12.addWidget(self.pushButtonNewAddress) + self.horizontalLayout_3.addLayout(self.verticalLayout_12) + self.verticalLayout_7 = QtWidgets.QVBoxLayout() + self.verticalLayout_7.setObjectName("verticalLayout_7") + self.horizontalLayoutSearch = QtWidgets.QHBoxLayout() + self.horizontalLayoutSearch.setContentsMargins(-1, 0, -1, -1) + self.horizontalLayoutSearch.setObjectName("horizontalLayoutSearch") + self.inboxSearchLineEdit = QtWidgets.QLineEdit(parent=self.inbox) + self.inboxSearchLineEdit.setObjectName("inboxSearchLineEdit") + self.horizontalLayoutSearch.addWidget(self.inboxSearchLineEdit) + self.inboxSearchOption = QtWidgets.QComboBox(parent=self.inbox) + self.inboxSearchOption.setObjectName("inboxSearchOption") + self.inboxSearchOption.addItem("") + self.inboxSearchOption.addItem("") + self.inboxSearchOption.addItem("") + self.inboxSearchOption.addItem("") + self.inboxSearchOption.addItem("") + self.horizontalLayoutSearch.addWidget(self.inboxSearchOption) + self.verticalLayout_7.addLayout(self.horizontalLayoutSearch) + self.tableWidgetInbox = QtWidgets.QTableWidget(parent=self.inbox) + self.tableWidgetInbox.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers) + self.tableWidgetInbox.setAlternatingRowColors(True) + self.tableWidgetInbox.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.ExtendedSelection) + self.tableWidgetInbox.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows) + self.tableWidgetInbox.setWordWrap(False) + self.tableWidgetInbox.setObjectName("tableWidgetInbox") + self.tableWidgetInbox.setColumnCount(4) + self.tableWidgetInbox.setRowCount(0) + item = QtWidgets.QTableWidgetItem() + self.tableWidgetInbox.setHorizontalHeaderItem(0, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidgetInbox.setHorizontalHeaderItem(1, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidgetInbox.setHorizontalHeaderItem(2, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidgetInbox.setHorizontalHeaderItem(3, item) + self.tableWidgetInbox.horizontalHeader().setCascadingSectionResizes(True) + self.tableWidgetInbox.horizontalHeader().setDefaultSectionSize(200) + self.tableWidgetInbox.horizontalHeader().setHighlightSections(False) + self.tableWidgetInbox.horizontalHeader().setMinimumSectionSize(27) + self.tableWidgetInbox.horizontalHeader().setSortIndicatorShown(False) + self.tableWidgetInbox.horizontalHeader().setStretchLastSection(True) + self.tableWidgetInbox.verticalHeader().setVisible(False) + self.tableWidgetInbox.verticalHeader().setDefaultSectionSize(26) + self.verticalLayout_7.addWidget(self.tableWidgetInbox) + self.textEditInboxMessage = QtWidgets.QTextEdit(parent=self.inbox) + self.textEditInboxMessage.setBaseSize(QtCore.QSize(0, 500)) + self.textEditInboxMessage.setReadOnly(True) + self.textEditInboxMessage.setObjectName("textEditInboxMessage") + self.verticalLayout_7.addWidget(self.textEditInboxMessage) + self.horizontalLayout_3.addLayout(self.verticalLayout_7) + self.gridLayout.addLayout(self.horizontalLayout_3, 0, 0, 1, 1) + icon2 = QtGui.QIcon() + icon2.addPixmap(QtGui.QPixmap(":/newPrefix/images/inbox.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.tabWidget.addTab(self.inbox, icon2, "") + self.send = QtWidgets.QWidget() + self.send.setObjectName("send") + self.gridLayout_7 = QtWidgets.QGridLayout(self.send) + self.gridLayout_7.setObjectName("gridLayout_7") + self.horizontalLayout = QtWidgets.QHBoxLayout() + self.horizontalLayout.setObjectName("horizontalLayout") + self.verticalLayout_2 = QtWidgets.QVBoxLayout() + self.verticalLayout_2.setObjectName("verticalLayout_2") + self.tableWidgetAddressBook = QtWidgets.QTableWidget(parent=self.send) + self.tableWidgetAddressBook.setMaximumSize(QtCore.QSize(200, 16777215)) + self.tableWidgetAddressBook.setAlternatingRowColors(True) + self.tableWidgetAddressBook.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.ExtendedSelection) + self.tableWidgetAddressBook.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows) + self.tableWidgetAddressBook.setObjectName("tableWidgetAddressBook") + self.tableWidgetAddressBook.setColumnCount(2) + self.tableWidgetAddressBook.setRowCount(0) + item = QtWidgets.QTableWidgetItem() + icon3 = QtGui.QIcon() + icon3.addPixmap(QtGui.QPixmap(":/newPrefix/images/addressbook.png"), QtGui.QIcon.Mode.Selected, QtGui.QIcon.State.Off) + item.setIcon(icon3) + self.tableWidgetAddressBook.setHorizontalHeaderItem(0, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidgetAddressBook.setHorizontalHeaderItem(1, item) + self.tableWidgetAddressBook.horizontalHeader().setCascadingSectionResizes(True) + self.tableWidgetAddressBook.horizontalHeader().setDefaultSectionSize(200) + self.tableWidgetAddressBook.horizontalHeader().setHighlightSections(False) + self.tableWidgetAddressBook.horizontalHeader().setStretchLastSection(True) + self.tableWidgetAddressBook.verticalHeader().setVisible(False) + self.verticalLayout_2.addWidget(self.tableWidgetAddressBook) + self.pushButtonAddAddressBook = QtWidgets.QPushButton(parent=self.send) + self.pushButtonAddAddressBook.setMaximumSize(QtCore.QSize(200, 16777215)) + self.pushButtonAddAddressBook.setObjectName("pushButtonAddAddressBook") + self.verticalLayout_2.addWidget(self.pushButtonAddAddressBook) + self.pushButtonFetchNamecoinID = QtWidgets.QPushButton(parent=self.send) + self.pushButtonFetchNamecoinID.setMaximumSize(QtCore.QSize(200, 16777215)) + font = QtGui.QFont() + font.setPointSize(9) + self.pushButtonFetchNamecoinID.setFont(font) + self.pushButtonFetchNamecoinID.setObjectName("pushButtonFetchNamecoinID") + self.verticalLayout_2.addWidget(self.pushButtonFetchNamecoinID) + self.horizontalLayout.addLayout(self.verticalLayout_2) + self.verticalLayout = QtWidgets.QVBoxLayout() + self.verticalLayout.setObjectName("verticalLayout") + self.tabWidgetSend = QtWidgets.QTabWidget(parent=self.send) + self.tabWidgetSend.setObjectName("tabWidgetSend") + self.tab = QtWidgets.QWidget() + self.tab.setObjectName("tab") + self.gridLayout_8 = QtWidgets.QGridLayout(self.tab) + self.gridLayout_8.setObjectName("gridLayout_8") + self.verticalLayout_5 = QtWidgets.QVBoxLayout() + self.verticalLayout_5.setObjectName("verticalLayout_5") + self.gridLayout_2 = QtWidgets.QGridLayout() + self.gridLayout_2.setObjectName("gridLayout_2") + self.label_3 = QtWidgets.QLabel(parent=self.tab) + self.label_3.setObjectName("label_3") + self.gridLayout_2.addWidget(self.label_3, 2, 0, 1, 1) + self.label_2 = QtWidgets.QLabel(parent=self.tab) + self.label_2.setObjectName("label_2") + self.gridLayout_2.addWidget(self.label_2, 0, 0, 1, 1) + self.lineEditSubject = QtWidgets.QLineEdit(parent=self.tab) + self.lineEditSubject.setText("") + self.lineEditSubject.setObjectName("lineEditSubject") + self.gridLayout_2.addWidget(self.lineEditSubject, 2, 1, 1, 1) + self.label = QtWidgets.QLabel(parent=self.tab) + self.label.setObjectName("label") + self.gridLayout_2.addWidget(self.label, 1, 0, 1, 1) + self.comboBoxSendFrom = QtWidgets.QComboBox(parent=self.tab) + self.comboBoxSendFrom.setMinimumSize(QtCore.QSize(300, 0)) + self.comboBoxSendFrom.setObjectName("comboBoxSendFrom") + self.gridLayout_2.addWidget(self.comboBoxSendFrom, 0, 1, 1, 1) + self.lineEditTo = QtWidgets.QLineEdit(parent=self.tab) + self.lineEditTo.setObjectName("lineEditTo") + self.gridLayout_2.addWidget(self.lineEditTo, 1, 1, 1, 1) + self.verticalLayout_5.addLayout(self.gridLayout_2) + self.textEditMessage = QtWidgets.QTextEdit(parent=self.tab) + self.textEditMessage.setObjectName("textEditMessage") + self.verticalLayout_5.addWidget(self.textEditMessage) + self.gridLayout_8.addLayout(self.verticalLayout_5, 0, 0, 1, 1) + self.tabWidgetSend.addTab(self.tab, "") + self.tab_2 = QtWidgets.QWidget() + self.tab_2.setObjectName("tab_2") + self.gridLayout_9 = QtWidgets.QGridLayout(self.tab_2) + self.gridLayout_9.setObjectName("gridLayout_9") + self.verticalLayout_6 = QtWidgets.QVBoxLayout() + self.verticalLayout_6.setObjectName("verticalLayout_6") + self.gridLayout_5 = QtWidgets.QGridLayout() + self.gridLayout_5.setObjectName("gridLayout_5") + self.label_8 = QtWidgets.QLabel(parent=self.tab_2) + self.label_8.setObjectName("label_8") + self.gridLayout_5.addWidget(self.label_8, 0, 0, 1, 1) + self.lineEditSubjectBroadcast = QtWidgets.QLineEdit(parent=self.tab_2) + self.lineEditSubjectBroadcast.setText("") + self.lineEditSubjectBroadcast.setObjectName("lineEditSubjectBroadcast") + self.gridLayout_5.addWidget(self.lineEditSubjectBroadcast, 1, 1, 1, 1) + self.label_7 = QtWidgets.QLabel(parent=self.tab_2) + self.label_7.setObjectName("label_7") + self.gridLayout_5.addWidget(self.label_7, 1, 0, 1, 1) + self.comboBoxSendFromBroadcast = QtWidgets.QComboBox(parent=self.tab_2) + self.comboBoxSendFromBroadcast.setMinimumSize(QtCore.QSize(300, 0)) + self.comboBoxSendFromBroadcast.setObjectName("comboBoxSendFromBroadcast") + self.gridLayout_5.addWidget(self.comboBoxSendFromBroadcast, 0, 1, 1, 1) + self.verticalLayout_6.addLayout(self.gridLayout_5) + self.textEditMessageBroadcast = QtWidgets.QTextEdit(parent=self.tab_2) + self.textEditMessageBroadcast.setObjectName("textEditMessageBroadcast") + self.verticalLayout_6.addWidget(self.textEditMessageBroadcast) + self.gridLayout_9.addLayout(self.verticalLayout_6, 0, 0, 1, 1) + self.tabWidgetSend.addTab(self.tab_2, "") + self.verticalLayout.addWidget(self.tabWidgetSend) + self.horizontalLayout_5 = QtWidgets.QHBoxLayout() + self.horizontalLayout_5.setObjectName("horizontalLayout_5") + self.pushButtonTTL = QtWidgets.QPushButton(parent=self.send) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.pushButtonTTL.sizePolicy().hasHeightForWidth()) + self.pushButtonTTL.setSizePolicy(sizePolicy) + self.pushButtonTTL.setMaximumSize(QtCore.QSize(32, 16777215)) + palette = QtGui.QPalette() + brush = QtGui.QBrush(QtGui.QColor(0, 0, 255)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Active, QtGui.QPalette.ColorRole.ButtonText, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 255)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Inactive, QtGui.QPalette.ColorRole.ButtonText, brush) + brush = QtGui.QBrush(QtGui.QColor(120, 120, 120)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.ButtonText, brush) + self.pushButtonTTL.setPalette(palette) + font = QtGui.QFont() + font.setUnderline(True) + self.pushButtonTTL.setFont(font) + self.pushButtonTTL.setFlat(True) + self.pushButtonTTL.setObjectName("pushButtonTTL") + self.horizontalLayout_5.addWidget(self.pushButtonTTL) + self.horizontalSliderTTL = QtWidgets.QSlider(parent=self.send) + self.horizontalSliderTTL.setMinimumSize(QtCore.QSize(35, 0)) + self.horizontalSliderTTL.setMaximumSize(QtCore.QSize(70, 16777215)) + self.horizontalSliderTTL.setOrientation(QtCore.Qt.Orientation.Horizontal) + self.horizontalSliderTTL.setInvertedAppearance(False) + self.horizontalSliderTTL.setInvertedControls(False) + self.horizontalSliderTTL.setObjectName("horizontalSliderTTL") + self.horizontalLayout_5.addWidget(self.horizontalSliderTTL) + self.labelHumanFriendlyTTLDescription = QtWidgets.QLabel(parent=self.send) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.labelHumanFriendlyTTLDescription.sizePolicy().hasHeightForWidth()) + self.labelHumanFriendlyTTLDescription.setSizePolicy(sizePolicy) + self.labelHumanFriendlyTTLDescription.setMinimumSize(QtCore.QSize(45, 0)) + self.labelHumanFriendlyTTLDescription.setMaximumSize(QtCore.QSize(45, 16777215)) + self.labelHumanFriendlyTTLDescription.setObjectName("labelHumanFriendlyTTLDescription") + self.horizontalLayout_5.addWidget(self.labelHumanFriendlyTTLDescription) + self.pushButtonSend = QtWidgets.QPushButton(parent=self.send) + self.pushButtonSend.setMaximumSize(QtCore.QSize(16777215, 16777215)) + self.pushButtonSend.setObjectName("pushButtonSend") + self.horizontalLayout_5.addWidget(self.pushButtonSend) + self.verticalLayout.addLayout(self.horizontalLayout_5) + self.horizontalLayout.addLayout(self.verticalLayout) + self.gridLayout_7.addLayout(self.horizontalLayout, 0, 0, 1, 1) + icon4 = QtGui.QIcon() + icon4.addPixmap(QtGui.QPixmap(":/newPrefix/images/send.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.tabWidget.addTab(self.send, icon4, "") + self.subscriptions = QtWidgets.QWidget() + self.subscriptions.setObjectName("subscriptions") + self.gridLayout_3 = QtWidgets.QGridLayout(self.subscriptions) + self.gridLayout_3.setObjectName("gridLayout_3") + self.horizontalLayout_4 = QtWidgets.QHBoxLayout() + self.horizontalLayout_4.setObjectName("horizontalLayout_4") + self.verticalLayout_3 = QtWidgets.QVBoxLayout() + self.verticalLayout_3.setObjectName("verticalLayout_3") + self.treeWidgetSubscriptions = QtWidgets.QTreeWidget(parent=self.subscriptions) + self.treeWidgetSubscriptions.setMaximumSize(QtCore.QSize(200, 16777215)) + self.treeWidgetSubscriptions.setAlternatingRowColors(True) + self.treeWidgetSubscriptions.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.SingleSelection) + self.treeWidgetSubscriptions.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows) + self.treeWidgetSubscriptions.setObjectName("treeWidgetSubscriptions") + icon5 = QtGui.QIcon() + icon5.addPixmap(QtGui.QPixmap(":/newPrefix/images/subscriptions.png"), QtGui.QIcon.Mode.Selected, QtGui.QIcon.State.Off) + self.treeWidgetSubscriptions.headerItem().setIcon(0, icon5) + self.verticalLayout_3.addWidget(self.treeWidgetSubscriptions) + self.pushButtonAddSubscription = QtWidgets.QPushButton(parent=self.subscriptions) + self.pushButtonAddSubscription.setMaximumSize(QtCore.QSize(200, 16777215)) + self.pushButtonAddSubscription.setObjectName("pushButtonAddSubscription") + self.verticalLayout_3.addWidget(self.pushButtonAddSubscription) + self.horizontalLayout_4.addLayout(self.verticalLayout_3) + self.verticalLayout_4 = QtWidgets.QVBoxLayout() + self.verticalLayout_4.setObjectName("verticalLayout_4") + self.horizontalLayout_2 = QtWidgets.QHBoxLayout() + self.horizontalLayout_2.setObjectName("horizontalLayout_2") + self.inboxSearchLineEditSubscriptions = QtWidgets.QLineEdit(parent=self.subscriptions) + self.inboxSearchLineEditSubscriptions.setObjectName("inboxSearchLineEditSubscriptions") + self.horizontalLayout_2.addWidget(self.inboxSearchLineEditSubscriptions) + self.inboxSearchOptionSubscriptions = QtWidgets.QComboBox(parent=self.subscriptions) + self.inboxSearchOptionSubscriptions.setObjectName("inboxSearchOptionSubscriptions") + self.inboxSearchOptionSubscriptions.addItem("") + self.inboxSearchOptionSubscriptions.addItem("") + self.inboxSearchOptionSubscriptions.addItem("") + self.inboxSearchOptionSubscriptions.addItem("") + self.inboxSearchOptionSubscriptions.addItem("") + self.horizontalLayout_2.addWidget(self.inboxSearchOptionSubscriptions) + self.verticalLayout_4.addLayout(self.horizontalLayout_2) + self.tableWidgetInboxSubscriptions = QtWidgets.QTableWidget(parent=self.subscriptions) + self.tableWidgetInboxSubscriptions.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers) + self.tableWidgetInboxSubscriptions.setAlternatingRowColors(True) + self.tableWidgetInboxSubscriptions.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.ExtendedSelection) + self.tableWidgetInboxSubscriptions.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows) + self.tableWidgetInboxSubscriptions.setWordWrap(False) + self.tableWidgetInboxSubscriptions.setObjectName("tableWidgetInboxSubscriptions") + self.tableWidgetInboxSubscriptions.setColumnCount(4) + self.tableWidgetInboxSubscriptions.setRowCount(0) + item = QtWidgets.QTableWidgetItem() + self.tableWidgetInboxSubscriptions.setHorizontalHeaderItem(0, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidgetInboxSubscriptions.setHorizontalHeaderItem(1, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidgetInboxSubscriptions.setHorizontalHeaderItem(2, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidgetInboxSubscriptions.setHorizontalHeaderItem(3, item) + self.tableWidgetInboxSubscriptions.horizontalHeader().setCascadingSectionResizes(True) + self.tableWidgetInboxSubscriptions.horizontalHeader().setDefaultSectionSize(200) + self.tableWidgetInboxSubscriptions.horizontalHeader().setHighlightSections(False) + self.tableWidgetInboxSubscriptions.horizontalHeader().setMinimumSectionSize(27) + self.tableWidgetInboxSubscriptions.horizontalHeader().setSortIndicatorShown(False) + self.tableWidgetInboxSubscriptions.horizontalHeader().setStretchLastSection(True) + self.tableWidgetInboxSubscriptions.verticalHeader().setVisible(False) + self.tableWidgetInboxSubscriptions.verticalHeader().setDefaultSectionSize(26) + self.verticalLayout_4.addWidget(self.tableWidgetInboxSubscriptions) + self.textEditInboxMessageSubscriptions = QtWidgets.QTextEdit(parent=self.subscriptions) + self.textEditInboxMessageSubscriptions.setBaseSize(QtCore.QSize(0, 500)) + self.textEditInboxMessageSubscriptions.setReadOnly(True) + self.textEditInboxMessageSubscriptions.setObjectName("textEditInboxMessageSubscriptions") + self.verticalLayout_4.addWidget(self.textEditInboxMessageSubscriptions) + self.horizontalLayout_4.addLayout(self.verticalLayout_4) + self.gridLayout_3.addLayout(self.horizontalLayout_4, 0, 0, 1, 1) + icon6 = QtGui.QIcon() + icon6.addPixmap(QtGui.QPixmap(":/newPrefix/images/subscriptions.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.tabWidget.addTab(self.subscriptions, icon6, "") + self.tab_3 = QtWidgets.QWidget() + self.tab_3.setObjectName("tab_3") + self.gridLayout_4 = QtWidgets.QGridLayout(self.tab_3) + self.gridLayout_4.setObjectName("gridLayout_4") + self.horizontalLayout_7 = QtWidgets.QHBoxLayout() + self.horizontalLayout_7.setObjectName("horizontalLayout_7") + self.verticalLayout_17 = QtWidgets.QVBoxLayout() + self.verticalLayout_17.setObjectName("verticalLayout_17") + self.treeWidgetChans = QtWidgets.QTreeWidget(parent=self.tab_3) + self.treeWidgetChans.setMaximumSize(QtCore.QSize(200, 16777215)) + self.treeWidgetChans.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.treeWidgetChans.setLineWidth(1) + self.treeWidgetChans.setAlternatingRowColors(True) + self.treeWidgetChans.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.SingleSelection) + self.treeWidgetChans.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows) + self.treeWidgetChans.setObjectName("treeWidgetChans") + icon7 = QtGui.QIcon() + icon7.addPixmap(QtGui.QPixmap(":/newPrefix/images/can-icon-16px.png"), QtGui.QIcon.Mode.Selected, QtGui.QIcon.State.Off) + self.treeWidgetChans.headerItem().setIcon(0, icon7) + self.verticalLayout_17.addWidget(self.treeWidgetChans) + self.pushButtonAddChan = QtWidgets.QPushButton(parent=self.tab_3) + self.pushButtonAddChan.setMaximumSize(QtCore.QSize(200, 16777215)) + self.pushButtonAddChan.setObjectName("pushButtonAddChan") + self.verticalLayout_17.addWidget(self.pushButtonAddChan) + self.horizontalLayout_7.addLayout(self.verticalLayout_17) + self.verticalLayout_8 = QtWidgets.QVBoxLayout() + self.verticalLayout_8.setObjectName("verticalLayout_8") + self.horizontalLayout_6 = QtWidgets.QHBoxLayout() + self.horizontalLayout_6.setObjectName("horizontalLayout_6") + self.inboxSearchLineEditChans = QtWidgets.QLineEdit(parent=self.tab_3) + self.inboxSearchLineEditChans.setObjectName("inboxSearchLineEditChans") + self.horizontalLayout_6.addWidget(self.inboxSearchLineEditChans) + self.inboxSearchOptionChans = QtWidgets.QComboBox(parent=self.tab_3) + self.inboxSearchOptionChans.setObjectName("inboxSearchOptionChans") + self.inboxSearchOptionChans.addItem("") + self.inboxSearchOptionChans.addItem("") + self.inboxSearchOptionChans.addItem("") + self.inboxSearchOptionChans.addItem("") + self.inboxSearchOptionChans.addItem("") + self.horizontalLayout_6.addWidget(self.inboxSearchOptionChans) + self.verticalLayout_8.addLayout(self.horizontalLayout_6) + self.tableWidgetInboxChans = QtWidgets.QTableWidget(parent=self.tab_3) + self.tableWidgetInboxChans.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers) + self.tableWidgetInboxChans.setAlternatingRowColors(True) + self.tableWidgetInboxChans.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.ExtendedSelection) + self.tableWidgetInboxChans.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows) + self.tableWidgetInboxChans.setWordWrap(False) + self.tableWidgetInboxChans.setObjectName("tableWidgetInboxChans") + self.tableWidgetInboxChans.setColumnCount(4) + self.tableWidgetInboxChans.setRowCount(0) + item = QtWidgets.QTableWidgetItem() + self.tableWidgetInboxChans.setHorizontalHeaderItem(0, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidgetInboxChans.setHorizontalHeaderItem(1, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidgetInboxChans.setHorizontalHeaderItem(2, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidgetInboxChans.setHorizontalHeaderItem(3, item) + self.tableWidgetInboxChans.horizontalHeader().setCascadingSectionResizes(True) + self.tableWidgetInboxChans.horizontalHeader().setDefaultSectionSize(200) + self.tableWidgetInboxChans.horizontalHeader().setHighlightSections(False) + self.tableWidgetInboxChans.horizontalHeader().setMinimumSectionSize(27) + self.tableWidgetInboxChans.horizontalHeader().setSortIndicatorShown(False) + self.tableWidgetInboxChans.horizontalHeader().setStretchLastSection(True) + self.tableWidgetInboxChans.verticalHeader().setVisible(False) + self.tableWidgetInboxChans.verticalHeader().setDefaultSectionSize(26) + self.verticalLayout_8.addWidget(self.tableWidgetInboxChans) + self.textEditInboxMessageChans = QtWidgets.QTextEdit(parent=self.tab_3) + self.textEditInboxMessageChans.setBaseSize(QtCore.QSize(0, 500)) + self.textEditInboxMessageChans.setReadOnly(True) + self.textEditInboxMessageChans.setObjectName("textEditInboxMessageChans") + self.verticalLayout_8.addWidget(self.textEditInboxMessageChans) + self.horizontalLayout_7.addLayout(self.verticalLayout_8) + self.gridLayout_4.addLayout(self.horizontalLayout_7, 0, 0, 1, 1) + icon8 = QtGui.QIcon() + icon8.addPixmap(QtGui.QPixmap(":/newPrefix/images/can-icon-16px.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.tabWidget.addTab(self.tab_3, icon8, "") + self.blackwhitelist = QtWidgets.QWidget() + self.blackwhitelist.setObjectName("blackwhitelist") + self.gridLayout_6 = QtWidgets.QGridLayout(self.blackwhitelist) + self.gridLayout_6.setObjectName("gridLayout_6") + self.radioButtonBlacklist = QtWidgets.QRadioButton(parent=self.blackwhitelist) + self.radioButtonBlacklist.setChecked(True) + self.radioButtonBlacklist.setObjectName("radioButtonBlacklist") + self.gridLayout_6.addWidget(self.radioButtonBlacklist, 0, 0, 1, 2) + self.radioButtonWhitelist = QtWidgets.QRadioButton(parent=self.blackwhitelist) + self.radioButtonWhitelist.setObjectName("radioButtonWhitelist") + self.gridLayout_6.addWidget(self.radioButtonWhitelist, 1, 0, 1, 2) + self.pushButtonAddBlacklist = QtWidgets.QPushButton(parent=self.blackwhitelist) + self.pushButtonAddBlacklist.setObjectName("pushButtonAddBlacklist") + self.gridLayout_6.addWidget(self.pushButtonAddBlacklist, 2, 0, 1, 1) + spacerItem = QtWidgets.QSpacerItem(689, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + self.gridLayout_6.addItem(spacerItem, 2, 1, 1, 1) + self.tableWidgetBlacklist = QtWidgets.QTableWidget(parent=self.blackwhitelist) + self.tableWidgetBlacklist.setAlternatingRowColors(True) + self.tableWidgetBlacklist.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.SingleSelection) + self.tableWidgetBlacklist.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows) + self.tableWidgetBlacklist.setObjectName("tableWidgetBlacklist") + self.tableWidgetBlacklist.setColumnCount(2) + self.tableWidgetBlacklist.setRowCount(0) + item = QtWidgets.QTableWidgetItem() + self.tableWidgetBlacklist.setHorizontalHeaderItem(0, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidgetBlacklist.setHorizontalHeaderItem(1, item) + self.tableWidgetBlacklist.horizontalHeader().setCascadingSectionResizes(True) + self.tableWidgetBlacklist.horizontalHeader().setDefaultSectionSize(400) + self.tableWidgetBlacklist.horizontalHeader().setHighlightSections(False) + self.tableWidgetBlacklist.horizontalHeader().setSortIndicatorShown(False) + self.tableWidgetBlacklist.horizontalHeader().setStretchLastSection(True) + self.tableWidgetBlacklist.verticalHeader().setVisible(False) + self.gridLayout_6.addWidget(self.tableWidgetBlacklist, 3, 0, 1, 2) + icon9 = QtGui.QIcon() + icon9.addPixmap(QtGui.QPixmap(":/newPrefix/images/blacklist.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.tabWidget.addTab(self.blackwhitelist, icon9, "") + self.networkstatus = QtWidgets.QWidget() + self.networkstatus.setObjectName("networkstatus") + self.pushButtonStatusIcon = QtWidgets.QPushButton(parent=self.networkstatus) + self.pushButtonStatusIcon.setGeometry(QtCore.QRect(680, 440, 21, 23)) + self.pushButtonStatusIcon.setText("") + icon10 = QtGui.QIcon() + icon10.addPixmap(QtGui.QPixmap(":/newPrefix/images/redicon.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.pushButtonStatusIcon.setIcon(icon10) + self.pushButtonStatusIcon.setFlat(True) + self.pushButtonStatusIcon.setObjectName("pushButtonStatusIcon") + self.tableWidgetConnectionCount = QtWidgets.QTableWidget(parent=self.networkstatus) + self.tableWidgetConnectionCount.setGeometry(QtCore.QRect(20, 70, 241, 241)) + palette = QtGui.QPalette() + brush = QtGui.QBrush(QtGui.QColor(212, 208, 200)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Active, QtGui.QPalette.ColorRole.Base, brush) + brush = QtGui.QBrush(QtGui.QColor(212, 208, 200)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Inactive, QtGui.QPalette.ColorRole.Base, brush) + brush = QtGui.QBrush(QtGui.QColor(212, 208, 200)) + brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) + palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.Base, brush) + self.tableWidgetConnectionCount.setPalette(palette) + self.tableWidgetConnectionCount.setFrameShape(QtWidgets.QFrame.Shape.Box) + self.tableWidgetConnectionCount.setFrameShadow(QtWidgets.QFrame.Shadow.Plain) + self.tableWidgetConnectionCount.setProperty("showDropIndicator", False) + self.tableWidgetConnectionCount.setAlternatingRowColors(True) + self.tableWidgetConnectionCount.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.NoSelection) + self.tableWidgetConnectionCount.setObjectName("tableWidgetConnectionCount") + self.tableWidgetConnectionCount.setColumnCount(2) + self.tableWidgetConnectionCount.setRowCount(0) + item = QtWidgets.QTableWidgetItem() + self.tableWidgetConnectionCount.setHorizontalHeaderItem(0, item) + item = QtWidgets.QTableWidgetItem() + self.tableWidgetConnectionCount.setHorizontalHeaderItem(1, item) + self.tableWidgetConnectionCount.horizontalHeader().setCascadingSectionResizes(True) + self.tableWidgetConnectionCount.horizontalHeader().setHighlightSections(False) + self.tableWidgetConnectionCount.horizontalHeader().setStretchLastSection(True) + self.tableWidgetConnectionCount.verticalHeader().setVisible(False) + self.labelTotalConnections = QtWidgets.QLabel(parent=self.networkstatus) + self.labelTotalConnections.setGeometry(QtCore.QRect(20, 30, 401, 16)) + self.labelTotalConnections.setObjectName("labelTotalConnections") + self.labelStartupTime = QtWidgets.QLabel(parent=self.networkstatus) + self.labelStartupTime.setGeometry(QtCore.QRect(320, 110, 331, 20)) + self.labelStartupTime.setObjectName("labelStartupTime") + self.labelMessageCount = QtWidgets.QLabel(parent=self.networkstatus) + self.labelMessageCount.setGeometry(QtCore.QRect(350, 130, 361, 16)) + self.labelMessageCount.setObjectName("labelMessageCount") + self.labelPubkeyCount = QtWidgets.QLabel(parent=self.networkstatus) + self.labelPubkeyCount.setGeometry(QtCore.QRect(350, 170, 331, 16)) + self.labelPubkeyCount.setObjectName("labelPubkeyCount") + self.labelBroadcastCount = QtWidgets.QLabel(parent=self.networkstatus) + self.labelBroadcastCount.setGeometry(QtCore.QRect(350, 150, 351, 16)) + self.labelBroadcastCount.setObjectName("labelBroadcastCount") + self.labelLookupsPerSecond = QtWidgets.QLabel(parent=self.networkstatus) + self.labelLookupsPerSecond.setGeometry(QtCore.QRect(320, 250, 291, 16)) + self.labelLookupsPerSecond.setObjectName("labelLookupsPerSecond") + self.labelBytesRecvCount = QtWidgets.QLabel(parent=self.networkstatus) + self.labelBytesRecvCount.setGeometry(QtCore.QRect(350, 210, 251, 16)) + self.labelBytesRecvCount.setObjectName("labelBytesRecvCount") + self.labelBytesSentCount = QtWidgets.QLabel(parent=self.networkstatus) + self.labelBytesSentCount.setGeometry(QtCore.QRect(350, 230, 251, 16)) + self.labelBytesSentCount.setObjectName("labelBytesSentCount") + icon11 = QtGui.QIcon() + icon11.addPixmap(QtGui.QPixmap(":/newPrefix/images/networkstatus.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.tabWidget.addTab(self.networkstatus, icon11, "") + self.gridLayout_10.addWidget(self.tabWidget, 0, 0, 1, 1) + self.MainDock.setWidget(self.centralwidget) + MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(None), self.MainDock) + self.menubar = QtWidgets.QMenuBar(parent=MainWindow) + self.menubar.setGeometry(QtCore.QRect(0, 0, 885, 27)) + self.menubar.setObjectName("menubar") + self.menuFile = QtWidgets.QMenu(parent=self.menubar) + self.menuFile.setObjectName("menuFile") + self.menuSettings = QtWidgets.QMenu(parent=self.menubar) + self.menuSettings.setObjectName("menuSettings") + self.menuHelp = QtWidgets.QMenu(parent=self.menubar) + self.menuHelp.setObjectName("menuHelp") + MainWindow.setMenuBar(self.menubar) + self.statusbar = QtWidgets.QStatusBar(parent=MainWindow) + self.statusbar.setMaximumSize(QtCore.QSize(16777215, 22)) + self.statusbar.setObjectName("statusbar") + MainWindow.setStatusBar(self.statusbar) + self.actionImport_keys = QtGui.QAction(parent=MainWindow) + self.actionImport_keys.setObjectName("actionImport_keys") + self.actionManageKeys = QtGui.QAction(parent=MainWindow) + self.actionManageKeys.setCheckable(False) + self.actionManageKeys.setEnabled(True) + icon = QtGui.QIcon.fromTheme("dialog-password") + self.actionManageKeys.setIcon(icon) + self.actionManageKeys.setObjectName("actionManageKeys") + self.actionExit = QtGui.QAction(parent=MainWindow) + icon = QtGui.QIcon.fromTheme("application-exit") + self.actionExit.setIcon(icon) + self.actionExit.setObjectName("actionExit") + self.actionHelp = QtGui.QAction(parent=MainWindow) + icon = QtGui.QIcon.fromTheme("help-contents") + self.actionHelp.setIcon(icon) + self.actionHelp.setObjectName("actionHelp") + self.actionAbout = QtGui.QAction(parent=MainWindow) + icon = QtGui.QIcon.fromTheme("help-about") + self.actionAbout.setIcon(icon) + self.actionAbout.setObjectName("actionAbout") + self.actionSettings = QtGui.QAction(parent=MainWindow) + icon = QtGui.QIcon.fromTheme("document-properties") + self.actionSettings.setIcon(icon) + self.actionSettings.setObjectName("actionSettings") + self.actionRegenerateDeterministicAddresses = QtGui.QAction(parent=MainWindow) + icon = QtGui.QIcon.fromTheme("view-refresh") + self.actionRegenerateDeterministicAddresses.setIcon(icon) + self.actionRegenerateDeterministicAddresses.setObjectName("actionRegenerateDeterministicAddresses") + self.actionDeleteAllTrashedMessages = QtGui.QAction(parent=MainWindow) + icon = QtGui.QIcon.fromTheme("user-trash") + self.actionDeleteAllTrashedMessages.setIcon(icon) + self.actionDeleteAllTrashedMessages.setObjectName("actionDeleteAllTrashedMessages") + self.actionJoinChan = QtGui.QAction(parent=MainWindow) + icon = QtGui.QIcon.fromTheme("contact-new") + self.actionJoinChan.setIcon(icon) + self.actionJoinChan.setObjectName("actionJoinChan") + self.menuFile.addAction(self.actionManageKeys) + self.menuFile.addAction(self.actionDeleteAllTrashedMessages) + self.menuFile.addAction(self.actionRegenerateDeterministicAddresses) + self.menuFile.addAction(self.actionExit) + self.menuSettings.addAction(self.actionSettings) + self.menuHelp.addAction(self.actionHelp) + self.menuHelp.addAction(self.actionAbout) + self.menubar.addAction(self.menuFile.menuAction()) + self.menubar.addAction(self.menuSettings.menuAction()) + self.menubar.addAction(self.menuHelp.menuAction()) + + self.retranslateUi(MainWindow) + self.tabWidget.setCurrentIndex(0) + self.tabWidgetSend.setCurrentIndex(0) + QtCore.QMetaObject.connectSlotsByName(MainWindow) + MainWindow.setTabOrder(self.tableWidgetInbox, self.textEditInboxMessage) + MainWindow.setTabOrder(self.textEditInboxMessage, self.comboBoxSendFrom) + MainWindow.setTabOrder(self.comboBoxSendFrom, self.lineEditTo) + MainWindow.setTabOrder(self.lineEditTo, self.lineEditSubject) + MainWindow.setTabOrder(self.lineEditSubject, self.textEditMessage) + MainWindow.setTabOrder(self.textEditMessage, self.pushButtonSend) + MainWindow.setTabOrder(self.pushButtonSend, self.pushButtonAddSubscription) + MainWindow.setTabOrder(self.pushButtonAddSubscription, self.radioButtonBlacklist) + MainWindow.setTabOrder(self.radioButtonBlacklist, self.radioButtonWhitelist) + MainWindow.setTabOrder(self.radioButtonWhitelist, self.pushButtonAddBlacklist) + MainWindow.setTabOrder(self.pushButtonAddBlacklist, self.tableWidgetBlacklist) + MainWindow.setTabOrder(self.tableWidgetBlacklist, self.tableWidgetConnectionCount) + MainWindow.setTabOrder(self.tableWidgetConnectionCount, self.pushButtonStatusIcon) + + def retranslateUi(self, MainWindow): + _translate = QtCore.QCoreApplication.translate + self.MainDock.setWindowTitle(_translate("MainWindow", "Bitmessage")) + self.treeWidgetYourIdentities.headerItem().setText(0, _translate("MainWindow", "Identities")) + self.pushButtonNewAddress.setText(_translate("MainWindow", "New Indentitiy")) + self.inboxSearchLineEdit.setPlaceholderText(_translate("MainWindow", "Search")) + self.inboxSearchOption.setItemText(0, _translate("MainWindow", "All")) + self.inboxSearchOption.setItemText(1, _translate("MainWindow", "To")) + self.inboxSearchOption.setItemText(2, _translate("MainWindow", "From")) + self.inboxSearchOption.setItemText(3, _translate("MainWindow", "Subject")) + self.inboxSearchOption.setItemText(4, _translate("MainWindow", "Message")) + self.tableWidgetInbox.setSortingEnabled(True) + item = self.tableWidgetInbox.horizontalHeaderItem(0) + item.setText(_translate("MainWindow", "To")) + item = self.tableWidgetInbox.horizontalHeaderItem(1) + item.setText(_translate("MainWindow", "From")) + item = self.tableWidgetInbox.horizontalHeaderItem(2) + item.setText(_translate("MainWindow", "Subject")) + item = self.tableWidgetInbox.horizontalHeaderItem(3) + item.setText(_translate("MainWindow", "Received")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.inbox), _translate("MainWindow", "Messages")) + self.tableWidgetAddressBook.setSortingEnabled(True) + item = self.tableWidgetAddressBook.horizontalHeaderItem(0) + item.setText(_translate("MainWindow", "Address book")) + item = self.tableWidgetAddressBook.horizontalHeaderItem(1) + item.setText(_translate("MainWindow", "Address")) + self.pushButtonAddAddressBook.setText(_translate("MainWindow", "Add Contact")) + self.pushButtonFetchNamecoinID.setText(_translate("MainWindow", "Fetch Namecoin ID")) + self.label_3.setText(_translate("MainWindow", "Subject:")) + self.label_2.setText(_translate("MainWindow", "From:")) + self.label.setText(_translate("MainWindow", "To:")) + self.textEditMessage.setHtml(_translate("MainWindow", "\n" +"\n" +"


")) + self.tabWidgetSend.setTabText(self.tabWidgetSend.indexOf(self.tab), _translate("MainWindow", "Send ordinary Message")) + self.label_8.setText(_translate("MainWindow", "From:")) + self.label_7.setText(_translate("MainWindow", "Subject:")) + self.textEditMessageBroadcast.setHtml(_translate("MainWindow", "\n" +"\n" +"


")) + self.tabWidgetSend.setTabText(self.tabWidgetSend.indexOf(self.tab_2), _translate("MainWindow", "Send Message to your Subscribers")) + self.pushButtonTTL.setText(_translate("MainWindow", "TTL:")) + self.labelHumanFriendlyTTLDescription.setText(_translate("MainWindow", "X days")) + self.pushButtonSend.setText(_translate("MainWindow", "Send")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.send), _translate("MainWindow", "Send")) + self.treeWidgetSubscriptions.headerItem().setText(0, _translate("MainWindow", "Subscriptions")) + self.pushButtonAddSubscription.setText(_translate("MainWindow", "Add new Subscription")) + self.inboxSearchLineEditSubscriptions.setPlaceholderText(_translate("MainWindow", "Search")) + self.inboxSearchOptionSubscriptions.setItemText(0, _translate("MainWindow", "All")) + self.inboxSearchOptionSubscriptions.setItemText(1, _translate("MainWindow", "To")) + self.inboxSearchOptionSubscriptions.setItemText(2, _translate("MainWindow", "From")) + self.inboxSearchOptionSubscriptions.setItemText(3, _translate("MainWindow", "Subject")) + self.inboxSearchOptionSubscriptions.setItemText(4, _translate("MainWindow", "Message")) + self.tableWidgetInboxSubscriptions.setSortingEnabled(True) + item = self.tableWidgetInboxSubscriptions.horizontalHeaderItem(0) + item.setText(_translate("MainWindow", "To")) + item = self.tableWidgetInboxSubscriptions.horizontalHeaderItem(1) + item.setText(_translate("MainWindow", "From")) + item = self.tableWidgetInboxSubscriptions.horizontalHeaderItem(2) + item.setText(_translate("MainWindow", "Subject")) + item = self.tableWidgetInboxSubscriptions.horizontalHeaderItem(3) + item.setText(_translate("MainWindow", "Received")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.subscriptions), _translate("MainWindow", "Subscriptions")) + self.treeWidgetChans.headerItem().setText(0, _translate("MainWindow", "Chans")) + self.pushButtonAddChan.setText(_translate("MainWindow", "Add Chan")) + self.inboxSearchLineEditChans.setPlaceholderText(_translate("MainWindow", "Search")) + self.inboxSearchOptionChans.setItemText(0, _translate("MainWindow", "All")) + self.inboxSearchOptionChans.setItemText(1, _translate("MainWindow", "To")) + self.inboxSearchOptionChans.setItemText(2, _translate("MainWindow", "From")) + self.inboxSearchOptionChans.setItemText(3, _translate("MainWindow", "Subject")) + self.inboxSearchOptionChans.setItemText(4, _translate("MainWindow", "Message")) + self.tableWidgetInboxChans.setSortingEnabled(True) + item = self.tableWidgetInboxChans.horizontalHeaderItem(0) + item.setText(_translate("MainWindow", "To")) + item = self.tableWidgetInboxChans.horizontalHeaderItem(1) + item.setText(_translate("MainWindow", "From")) + item = self.tableWidgetInboxChans.horizontalHeaderItem(2) + item.setText(_translate("MainWindow", "Subject")) + item = self.tableWidgetInboxChans.horizontalHeaderItem(3) + item.setText(_translate("MainWindow", "Received")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), _translate("MainWindow", "Chans")) + self.radioButtonBlacklist.setText(_translate("MainWindow", "Use a Blacklist (Allow all incoming messages except those on the Blacklist)")) + self.radioButtonWhitelist.setText(_translate("MainWindow", "Use a Whitelist (Block all incoming messages except those on the Whitelist)")) + self.pushButtonAddBlacklist.setText(_translate("MainWindow", "Add new entry")) + self.tableWidgetBlacklist.setSortingEnabled(True) + item = self.tableWidgetBlacklist.horizontalHeaderItem(0) + item.setText(_translate("MainWindow", "Name or Label")) + item = self.tableWidgetBlacklist.horizontalHeaderItem(1) + item.setText(_translate("MainWindow", "Address")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.blackwhitelist), _translate("MainWindow", "Blacklist")) + item = self.tableWidgetConnectionCount.horizontalHeaderItem(0) + item.setText(_translate("MainWindow", "Stream #")) + item = self.tableWidgetConnectionCount.horizontalHeaderItem(1) + item.setText(_translate("MainWindow", "Connections")) + self.labelTotalConnections.setText(_translate("MainWindow", "Total connections:")) + self.labelStartupTime.setText(_translate("MainWindow", "Since startup:")) + self.labelMessageCount.setText(_translate("MainWindow", "Processed 0 person-to-person messages.")) + self.labelPubkeyCount.setText(_translate("MainWindow", "Processed 0 public keys.")) + self.labelBroadcastCount.setText(_translate("MainWindow", "Processed 0 broadcasts.")) + self.labelLookupsPerSecond.setText(_translate("MainWindow", "Inventory lookups per second: 0")) + self.labelBytesRecvCount.setText(_translate("MainWindow", "Down: 0 KB/s")) + self.labelBytesSentCount.setText(_translate("MainWindow", "Up: 0 KB/s")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.networkstatus), _translate("MainWindow", "Network Status")) + self.menuFile.setTitle(_translate("MainWindow", "File")) + self.menuSettings.setTitle(_translate("MainWindow", "Settings")) + self.menuHelp.setTitle(_translate("MainWindow", "Help")) + self.actionImport_keys.setText(_translate("MainWindow", "Import keys")) + self.actionManageKeys.setText(_translate("MainWindow", "Manage keys")) + self.actionExit.setText(_translate("MainWindow", "Quit")) + self.actionExit.setShortcut(_translate("MainWindow", "Ctrl+Q")) + self.actionHelp.setText(_translate("MainWindow", "Help")) + self.actionHelp.setShortcut(_translate("MainWindow", "F1")) + self.actionAbout.setText(_translate("MainWindow", "About")) + self.actionSettings.setText(_translate("MainWindow", "Settings")) + self.actionRegenerateDeterministicAddresses.setText(_translate("MainWindow", "Regenerate deterministic addresses")) + self.actionDeleteAllTrashedMessages.setText(_translate("MainWindow", "Delete all trashed messages")) + self.actionJoinChan.setText(_translate("MainWindow", "Join / Create chan")) diff --git a/src/bitmessageqt/bitmessageui.ui b/src/bitmessageqt/bitmessageui.ui index fef40be6dc..16a4670bac 100644 --- a/src/bitmessageqt/bitmessageui.ui +++ b/src/bitmessageqt/bitmessageui.ui @@ -2,6 +2,7 @@ MainWindow + 0 @@ -17,13 +18,13 @@ :/newPrefix/images/can-icon-24px.png:/newPrefix/images/can-icon-24px.png - - QTabWidget::Rounded - + + QTabWidget::Rounded + 0 @@ -1290,6 +1291,7 @@ p, li { white-space: pre-wrap; } + diff --git a/src/bitmessageqt/blacklist.py b/src/bitmessageqt/blacklist.py index 093f23d866..ec03f66132 100644 --- a/src/bitmessageqt/blacklist.py +++ b/src/bitmessageqt/blacklist.py @@ -1,42 +1,37 @@ -from PyQt4 import QtCore, QtGui +from PyQt6 import QtCore, QtGui, QtWidgets -import widgets +import bitmessageqt.widgets as widgets from addresses import addBMIfNotPresent from bmconfigparser import config -from dialogs import AddAddressDialog +from .dialogs import AddAddressDialog from helper_sql import sqlExecute, sqlQuery from queues import UISignalQueue -from retranslateui import RetranslateMixin +from .retranslateui import RetranslateMixin from tr import _translate -from uisignaler import UISignaler -from utils import avatarize +from .uisignaler import UISignaler +from .utils import avatarize -class Blacklist(QtGui.QWidget, RetranslateMixin): +class Blacklist(QtWidgets.QWidget, RetranslateMixin): def __init__(self, parent=None): super(Blacklist, self).__init__(parent) widgets.load('blacklist.ui', self) - QtCore.QObject.connect(self.radioButtonBlacklist, QtCore.SIGNAL( - "clicked()"), self.click_radioButtonBlacklist) - QtCore.QObject.connect(self.radioButtonWhitelist, QtCore.SIGNAL( - "clicked()"), self.click_radioButtonWhitelist) - QtCore.QObject.connect(self.pushButtonAddBlacklist, QtCore.SIGNAL( - "clicked()"), self.click_pushButtonAddBlacklist) + self.radioButtonBlacklist.clicked.connect(self.click_radioButtonBlacklist) + self.radioButtonWhitelist.clicked.connect(self.click_radioButtonWhitelist) + self.pushButtonAddBlacklist.clicked.connect(self.click_pushButtonAddBlacklist) self.init_blacklist_popup_menu() # Initialize blacklist - QtCore.QObject.connect(self.tableWidgetBlacklist, QtCore.SIGNAL( - "itemChanged(QTableWidgetItem *)"), self.tableWidgetBlacklistItemChanged) + self.tableWidgetBlacklist.itemChanged.connect(self.tableWidgetBlacklistItemChanged) # Set the icon sizes for the identicons identicon_size = 3*7 self.tableWidgetBlacklist.setIconSize(QtCore.QSize(identicon_size, identicon_size)) self.UISignalThread = UISignaler.get() - QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL( - "rerenderBlackWhiteList()"), self.rerenderBlackWhiteList) + self.UISignalThread.rerenderBlackWhiteList.connect(self.rerenderBlackWhiteList) def click_radioButtonBlacklist(self): if config.get('bitmessagesettings', 'blackwhitelist') == 'white': @@ -118,7 +113,7 @@ def tableWidgetBlacklistItemChanged(self, item): def init_blacklist_popup_menu(self, connectSignal=True): # Popup menu for the Blacklist page - self.blacklistContextMenuToolbar = QtGui.QToolBar() + self.blacklistContextMenuToolbar = QtWidgets.QToolBar() # Actions self.actionBlacklistNew = self.blacklistContextMenuToolbar.addAction( _translate( @@ -141,12 +136,10 @@ def init_blacklist_popup_menu(self, connectSignal=True): "MainWindow", "Set avatar..."), self.on_action_BlacklistSetAvatar) self.tableWidgetBlacklist.setContextMenuPolicy( - QtCore.Qt.CustomContextMenu) + QtCore.Qt.ContextMenuPolicy.CustomContextMenu) if connectSignal: - self.connect(self.tableWidgetBlacklist, QtCore.SIGNAL( - 'customContextMenuRequested(const QPoint&)'), - self.on_context_menuBlacklist) - self.popMenuBlacklist = QtGui.QMenu(self) + self.tableWidgetBlacklist.customContextMenuRequested.connect(self.on_context_menuBlacklist) + self.popMenuBlacklist = QtWidgets.QMenu(self) # self.popMenuBlacklist.addAction( self.actionBlacklistNew ) self.popMenuBlacklist.addAction(self.actionBlacklistDelete) self.popMenuBlacklist.addSeparator() @@ -172,12 +165,12 @@ def rerenderBlackWhiteList(self): for row in queryreturn: label, address, enabled = row self.tableWidgetBlacklist.insertRow(0) - newItem = QtGui.QTableWidgetItem(unicode(label, 'utf-8')) + newItem = QtWidgets.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 = QtWidgets.QTableWidgetItem(address) newItem.setFlags( QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) if not enabled: diff --git a/src/bitmessageqt/dialogs.py b/src/bitmessageqt/dialogs.py index dc31e26697..9cea3fd828 100644 --- a/src/bitmessageqt/dialogs.py +++ b/src/bitmessageqt/dialogs.py @@ -2,17 +2,17 @@ Custom dialog classes """ # pylint: disable=too-few-public-methods -from PyQt4 import QtGui +from PyQt6 import QtGui, QtWidgets import paths -import widgets -from address_dialogs import ( +import bitmessageqt.widgets as widgets +from .address_dialogs import ( AddAddressDialog, EmailGatewayDialog, NewAddressDialog, NewSubscriptionDialog, RegenerateAddressesDialog, SpecialAddressBehaviorDialog ) -from newchandialog import NewChanDialog -from settings import SettingsDialog +from .newchandialog import NewChanDialog +from .settings import SettingsDialog from tr import _translate from version import softwareVersion @@ -25,7 +25,7 @@ ] -class AboutDialog(QtGui.QDialog): +class AboutDialog(QtWidgets.QDialog): """The `About` dialog""" def __init__(self, parent=None): super(AboutDialog, self).__init__(parent) @@ -50,10 +50,10 @@ def __init__(self, parent=None): except AttributeError: pass - self.setFixedSize(QtGui.QWidget.sizeHint(self)) + self.setFixedSize(QtWidgets.QWidget.sizeHint(self)) -class IconGlossaryDialog(QtGui.QDialog): +class IconGlossaryDialog(QtWidgets.QDialog): """The `Icon Glossary` dialog, explaining the status icon colors""" def __init__(self, parent=None, config=None): super(IconGlossaryDialog, self).__init__(parent) @@ -66,20 +66,20 @@ def __init__(self, parent=None, config=None): "iconGlossaryDialog", "You are using TCP port %1. (This can be changed in the settings)." ).arg(config.getint('bitmessagesettings', 'port'))) - self.setFixedSize(QtGui.QWidget.sizeHint(self)) + self.setFixedSize(QtWidgets.QWidget.sizeHint(self)) -class HelpDialog(QtGui.QDialog): +class HelpDialog(QtWidgets.QDialog): """The `Help` dialog""" def __init__(self, parent=None): super(HelpDialog, self).__init__(parent) widgets.load('help.ui', self) - self.setFixedSize(QtGui.QWidget.sizeHint(self)) + self.setFixedSize(QtWidgets.QWidget.sizeHint(self)) -class ConnectDialog(QtGui.QDialog): +class ConnectDialog(QtWidgets.QDialog): """The `Connect` dialog""" def __init__(self, parent=None): super(ConnectDialog, self).__init__(parent) widgets.load('connect.ui', self) - self.setFixedSize(QtGui.QWidget.sizeHint(self)) + self.setFixedSize(QtWidgets.QWidget.sizeHint(self)) diff --git a/src/bitmessageqt/foldertree.py b/src/bitmessageqt/foldertree.py index c50b7d3d47..4dfb8bb968 100644 --- a/src/bitmessageqt/foldertree.py +++ b/src/bitmessageqt/foldertree.py @@ -4,15 +4,15 @@ # pylint: disable=too-many-arguments,bad-super-call # pylint: disable=attribute-defined-outside-init -from cgi import escape +from html import escape -from PyQt4 import QtCore, QtGui +from PyQt6 import QtCore, QtGui, QtWidgets from bmconfigparser import config from helper_sql import sqlExecute, sqlQuery -from settingsmixin import SettingsMixin +from .settingsmixin import SettingsMixin from tr import _translate -from utils import avatarize +from .utils import avatarize # for pylupdate _translate("MainWindow", "inbox") @@ -20,7 +20,7 @@ _translate("MainWindow", "sent") _translate("MainWindow", "trash") -TimestampRole = QtCore.Qt.UserRole + 1 +TimestampRole = QtCore.Qt.ItemDataRole.UserRole + 1 class AccountMixin(object): @@ -40,13 +40,13 @@ def accountColor(self): return QtGui.QColor(216, 119, 0) elif self.type in [self.MAILINGLIST, self.SUBSCRIPTION]: return QtGui.QColor(137, 4, 177) - return QtGui.QApplication.palette().text().color() + return QtWidgets.QApplication.palette().text().color() def folderColor(self): """QT UI color for a folder""" if not self.parent().isEnabled: return QtGui.QColor(128, 128, 128) - return QtGui.QApplication.palette().text().color() + return QtWidgets.QApplication.palette().text().color() def accountBrush(self): """Account brush (for QT UI)""" @@ -83,7 +83,7 @@ def setUnreadCount(self, cnt): except AttributeError: pass self.unreadCount = int(cnt) - if isinstance(self, QtGui.QTreeWidgetItem): + if isinstance(self, QtWidgets.QTreeWidgetItem): self.emitDataChanged() def setEnabled(self, enabled): @@ -97,15 +97,15 @@ def setEnabled(self, enabled): for i in range(self.childCount()): if isinstance(self.child(i), Ui_FolderWidget): self.child(i).setEnabled(enabled) - if isinstance(self, QtGui.QTreeWidgetItem): + if isinstance(self, QtWidgets.QTreeWidgetItem): self.emitDataChanged() def setType(self): """Set account type (QT UI)""" - self.setFlags(self.flags() | QtCore.Qt.ItemIsEditable) + self.setFlags(self.flags() | QtCore.Qt.ItemFlag.ItemIsEditable) if self.address is None: self.type = self.ALL - self.setFlags(self.flags() & ~QtCore.Qt.ItemIsEditable) + self.setFlags(self.flags() & ~QtCore.Qt.ItemFlag.ItemIsEditable) elif config.safeGetBoolean(self.address, 'chan'): self.type = self.CHAN elif config.safeGetBoolean(self.address, 'mailinglist'): @@ -144,11 +144,11 @@ def defaultLabel(self): return retval or unicode(self.address, 'utf-8') -class BMTreeWidgetItem(QtGui.QTreeWidgetItem, AccountMixin): +class BMTreeWidgetItem(QtWidgets.QTreeWidgetItem, AccountMixin): """A common abstract class for Tree widget item""" def __init__(self, parent, pos, address, unreadCount): - super(QtGui.QTreeWidgetItem, self).__init__() + super(QtWidgets.QTreeWidgetItem, self).__init__() self.setAddress(address) self.setUnreadCount(unreadCount) self._setup(parent, pos) @@ -159,14 +159,14 @@ def _getAddressBracket(self, unreadCount=False): def data(self, column, role): """Override internal QT method for returning object data""" if column == 0: - if role == QtCore.Qt.DisplayRole: + if role == QtCore.Qt.ItemDataRole.DisplayRole: return self._getLabel() + self._getAddressBracket( self.unreadCount > 0) - elif role == QtCore.Qt.EditRole: + elif role == QtCore.Qt.ItemDataRole.EditRole: return self._getLabel() - elif role == QtCore.Qt.ToolTipRole: + elif role == QtCore.Qt.ItemDataRole.ToolTipRole: return self._getLabel() + self._getAddressBracket(False) - elif role == QtCore.Qt.FontRole: + elif role == QtCore.Qt.ItemDataRole.FontRole: font = QtGui.QFont() font.setBold(self.unreadCount > 0) return font @@ -195,7 +195,7 @@ def setFolderName(self, fname): def data(self, column, role): """Override internal QT method for returning object data""" - if column == 0 and role == QtCore.Qt.ForegroundRole: + if column == 0 and role == QtCore.Qt.ItemDataRole.ForegroundRole: return self.folderBrush() return super(Ui_FolderWidget, self).data(column, role) @@ -216,7 +216,7 @@ def __lt__(self, other): return self.folderName < other.folderName return x >= y if reverse else x < y - return super(QtGui.QTreeWidgetItem, self).__lt__(other) + return super(QtWidgets.QTreeWidgetItem, self).__lt__(other) class Ui_AddressWidget(BMTreeWidgetItem, SettingsMixin): @@ -252,16 +252,16 @@ def _getAddressBracket(self, unreadCount=False): def data(self, column, role): """Override internal QT method for returning object data""" if column == 0: - if role == QtCore.Qt.DecorationRole: + if role == QtCore.Qt.ItemDataRole.DecorationRole: return avatarize( self.address or self._getLabel().encode('utf8')) - elif role == QtCore.Qt.ForegroundRole: + elif role == QtCore.Qt.ItemDataRole.ForegroundRole: return self.accountBrush() return super(Ui_AddressWidget, self).data(column, role) 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 \ + if role == QtCore.Qt.ItemDataRole.EditRole \ and self.type != AccountMixin.SUBSCRIPTION: config.set( str(self.address), 'label', @@ -275,7 +275,7 @@ def setData(self, column, role, value): def setAddress(self, address): """Set address to object (for QT UI)""" super(Ui_AddressWidget, self).setAddress(address) - self.setData(0, QtCore.Qt.UserRole, self.address) + self.setData(0, QtCore.Qt.ItemDataRole.UserRole, self.address) def _getSortRank(self): return self.type if self.isEnabled else (self.type + 100) @@ -295,7 +295,7 @@ def __lt__(self, other): if self._getSortRank() < other._getSortRank() else reverse ) - return super(QtGui.QTreeWidgetItem, self).__lt__(other) + return super(QtWidgets.QTreeWidgetItem, self).__lt__(other) class Ui_SubscriptionWidget(Ui_AddressWidget): @@ -321,7 +321,7 @@ def setType(self): def setData(self, column, role, value): """Save subscription label to database""" - if role == QtCore.Qt.EditRole: + if role == QtCore.Qt.ItemDataRole.EditRole: if isinstance(value, QtCore.QVariant): label = str( value.toString().toUtf8()).decode('utf-8', 'ignore') @@ -333,17 +333,17 @@ def setData(self, column, role, value): return super(Ui_SubscriptionWidget, self).setData(column, role, value) -class BMTableWidgetItem(QtGui.QTableWidgetItem, SettingsMixin): +class BMTableWidgetItem(QtWidgets.QTableWidgetItem, SettingsMixin): """A common abstract class for Table widget item""" def __init__(self, label=None, unread=False): - super(QtGui.QTableWidgetItem, self).__init__() + super(QtWidgets.QTableWidgetItem, self).__init__() self.setLabel(label) self.setUnread(unread) self._setup() def _setup(self): - self.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) + self.setFlags(QtCore.Qt.ItemFlag.ItemIsSelectable | QtCore.Qt.ItemFlag.ItemIsEnabled) def setLabel(self, label): """Set object label""" @@ -356,10 +356,10 @@ def setUnread(self, unread): def data(self, role): """Return object data (QT UI)""" if role in ( - QtCore.Qt.DisplayRole, QtCore.Qt.EditRole, QtCore.Qt.ToolTipRole + QtCore.Qt.ItemDataRole.DisplayRole, QtCore.Qt.ItemDataRole.EditRole, QtCore.Qt.ItemDataRole.ToolTipRole ): return self.label - elif role == QtCore.Qt.FontRole: + elif role == QtCore.Qt.ItemDataRole.FontRole: font = QtGui.QFont() font.setBold(self.unread) return font @@ -379,13 +379,13 @@ def _getLabel(self): def data(self, role): """Return object data (QT UI)""" - if role == QtCore.Qt.ToolTipRole: + if role == QtCore.Qt.ItemDataRole.ToolTipRole: return self.label + " (" + self.address + ")" - elif role == QtCore.Qt.DecorationRole: + elif role == QtCore.Qt.ItemDataRole.DecorationRole: if config.safeGetBoolean( 'bitmessagesettings', 'useidenticons'): return avatarize(self.address or self.label) - elif role == QtCore.Qt.ForegroundRole: + elif role == QtCore.Qt.ItemDataRole.ForegroundRole: return self.accountBrush() return super(BMAddressWidget, self).data(role) @@ -424,13 +424,13 @@ def setLabel(self, label=None): def data(self, role): """Return object data (QT UI)""" - if role == QtCore.Qt.UserRole: + if role == QtCore.Qt.ItemDataRole.UserRole: return self.address return super(MessageList_AddressWidget, self).data(role) def setData(self, role, value): """Set object data""" - if role == QtCore.Qt.EditRole: + if role == QtCore.Qt.ItemDataRole.EditRole: self.setLabel() return super(MessageList_AddressWidget, self).setData(role, value) @@ -438,7 +438,7 @@ def setData(self, role, value): def __lt__(self, other): if isinstance(other, MessageList_AddressWidget): return self.label.lower() < other.label.lower() - return super(QtGui.QTableWidgetItem, self).__lt__(other) + return super(QtWidgets.QTableWidgetItem, self).__lt__(other) class MessageList_SubjectWidget(BMTableWidgetItem): @@ -453,9 +453,9 @@ def setSubject(self, subject): def data(self, role): """Return object data (QT UI)""" - if role == QtCore.Qt.UserRole: + if role == QtCore.Qt.ItemDataRole.UserRole: return self.subject - if role == QtCore.Qt.ToolTipRole: + if role == QtCore.Qt.ItemDataRole.ToolTipRole: return escape(unicode(self.subject, 'utf-8')) return super(MessageList_SubjectWidget, self).data(role) @@ -463,7 +463,7 @@ def data(self, role): def __lt__(self, other): if isinstance(other, MessageList_SubjectWidget): return self.label.lower() < other.label.lower() - return super(QtGui.QTableWidgetItem, self).__lt__(other) + return super(QtWidgets.QTableWidgetItem, self).__lt__(other) # In order for the time columns on the Inbox and Sent tabs to be sorted @@ -473,26 +473,26 @@ class MessageList_TimeWidget(BMTableWidgetItem): """ A subclass of QTableWidgetItem for received (lastactiontime) field. '<' operator is overloaded to sort by TimestampRole == 33 - msgid is available by QtCore.Qt.UserRole + msgid is available by QtCore.Qt.ItemDataRole.UserRole """ def __init__(self, label=None, unread=False, timestamp=None, msgid=''): super(MessageList_TimeWidget, self).__init__(label, unread) - self.setData(QtCore.Qt.UserRole, QtCore.QByteArray(msgid)) + self.setData(QtCore.Qt.ItemDataRole.UserRole, QtCore.QByteArray(msgid)) self.setData(TimestampRole, int(timestamp)) def __lt__(self, other): return self.data(TimestampRole) < other.data(TimestampRole) - def data(self, role=QtCore.Qt.UserRole): + def data(self, role=QtCore.Qt.ItemDataRole.UserRole): """ - Returns expected python types for QtCore.Qt.UserRole and TimestampRole + Returns expected python types for QtCore.Qt.ItemDataRole.UserRole and TimestampRole custom roles and super for any Qt role """ data = super(MessageList_TimeWidget, self).data(role) if role == TimestampRole: return int(data.toPyObject()) - if role == QtCore.Qt.UserRole: + if role == QtCore.Qt.ItemDataRole.UserRole: return str(data.toPyObject()) return data @@ -506,13 +506,13 @@ def __init__(self, label=None, acc_type=AccountMixin.NORMAL): def data(self, role): """Return object data""" - if role == QtCore.Qt.UserRole: + if role == QtCore.Qt.ItemDataRole.UserRole: return self.type return super(Ui_AddressBookWidgetItem, self).data(role) def setData(self, role, value): """Set data""" - if role == QtCore.Qt.EditRole: + if role == QtCore.Qt.ItemDataRole.EditRole: self.label = str( value.toString().toUtf8() if isinstance(value, QtCore.QVariant) else value @@ -540,7 +540,7 @@ def __lt__(self, other): if self.type == other.type: return self.label.lower() < other.label.lower() return not reverse if self.type < other.type else reverse - return super(QtGui.QTableWidgetItem, self).__lt__(other) + return super(QtWidgets.QTableWidgetItem, self).__lt__(other) class Ui_AddressBookWidgetItemLabel(Ui_AddressBookWidgetItem): @@ -563,14 +563,14 @@ def __init__(self, address, label, acc_type): def data(self, role): """Return object data""" - if role == QtCore.Qt.ToolTipRole: + if role == QtCore.Qt.ItemDataRole.ToolTipRole: return self.address - if role == QtCore.Qt.DecorationRole: + if role == QtCore.Qt.ItemDataRole.DecorationRole: return None return super(Ui_AddressBookWidgetItemAddress, self).data(role) -class AddressBookCompleter(QtGui.QCompleter): +class AddressBookCompleter(QtWidgets.QCompleter): """Addressbook completer""" def __init__(self): @@ -590,7 +590,7 @@ def splitPath(self, path): def pathFromIndex(self, index): """Perform autocompletion (reimplemented QCompleter method)""" autoString = unicode( - index.data(QtCore.Qt.EditRole).toString().toUtf8(), 'utf-8') + index.data(QtCore.Qt.ItemDataRole.EditRole).toString().toUtf8(), 'utf-8') text = unicode(self.widget().text().toUtf8(), 'utf-8') # If cursor position was saved, restore it, else save it diff --git a/src/bitmessageqt/messagecompose.py b/src/bitmessageqt/messagecompose.py index c51282f8aa..6c3af10efb 100644 --- a/src/bitmessageqt/messagecompose.py +++ b/src/bitmessageqt/messagecompose.py @@ -3,10 +3,10 @@ """ # pylint: disable=bad-continuation -from PyQt4 import QtCore, QtGui +from PyQt6 import QtCore, QtGui, QtWidgets -class MessageCompose(QtGui.QTextEdit): +class MessageCompose(QtWidgets.QTextEdit): """Editor class with wheel zoom functionality""" def __init__(self, parent=0): super(MessageCompose, self).__init__(parent) diff --git a/src/bitmessageqt/messageview.py b/src/bitmessageqt/messageview.py index 13ea16f97b..6d1d220b75 100644 --- a/src/bitmessageqt/messageview.py +++ b/src/bitmessageqt/messageview.py @@ -5,13 +5,13 @@ """ -from PyQt4 import QtCore, QtGui +from PyQt6 import QtCore, QtGui, QtWidgets -from safehtmlparser import SafeHTMLParser +from .safehtmlparser import SafeHTMLParser from tr import _translate -class MessageView(QtGui.QTextBrowser): +class MessageView(QtWidgets.QTextBrowser): """Message content viewer class, can switch between plaintext and HTML""" MODE_PLAIN = 0 MODE_HTML = 1 @@ -60,7 +60,7 @@ def wheelEvent(self, event): def setWrappingWidth(self, width=None): """Set word-wrapping width""" - self.setLineWrapMode(QtGui.QTextEdit.FixedPixelWidth) + self.setLineWrapMode(QtWidgets.QTextEdit.LineWrapMode.FixedPixelWidth) if width is None: width = self.width() self.setLineWrapColumnOrWidth(width) diff --git a/src/bitmessageqt/migrationwizard.py b/src/bitmessageqt/migrationwizard.py index 6e80f1dcf2..d76661b57d 100644 --- a/src/bitmessageqt/migrationwizard.py +++ b/src/bitmessageqt/migrationwizard.py @@ -1,7 +1,7 @@ #!/usr/bin/env python2.7 -from PyQt4 import QtCore, QtGui +from PyQt6 import QtCore, QtGui, QtWidgets -class MigrationWizardIntroPage(QtGui.QWizardPage): +class MigrationWizardIntroPage(QtWidgets.QWizardPage): def __init__(self): super(QtGui.QWizardPage, self).__init__() self.setTitle("Migrating configuration") @@ -18,7 +18,7 @@ def nextId(self): return 1 -class MigrationWizardAddressesPage(QtGui.QWizardPage): +class MigrationWizardAddressesPage(QtWidgets.QWizardPage): def __init__(self, addresses): super(QtGui.QWizardPage, self).__init__() self.setTitle("Addresses") @@ -34,7 +34,7 @@ def nextId(self): return 10 -class MigrationWizardGPUPage(QtGui.QWizardPage): +class MigrationWizardGPUPage(QtWidgets.QWizardPage): def __init__(self): super(QtGui.QWizardPage, self).__init__() self.setTitle("GPU") @@ -50,7 +50,7 @@ def nextId(self): return 10 -class MigrationWizardConclusionPage(QtGui.QWizardPage): +class MigrationWizardConclusionPage(QtWidgets.QWizardPage): def __init__(self): super(QtGui.QWizardPage, self).__init__() self.setTitle("All done!") @@ -63,7 +63,7 @@ def __init__(self): self.setLayout(layout) -class Ui_MigrationWizard(QtGui.QWizard): +class Ui_MigrationWizard(QtWidgets.QWizard): def __init__(self, addresses): super(QtGui.QWizard, self).__init__() @@ -81,4 +81,4 @@ def __init__(self, addresses): self.setWindowTitle("Migration from PyBitMessage wizard") self.adjustSize() - self.show() \ No newline at end of file + self.show() diff --git a/src/bitmessageqt/networkstatus.py b/src/bitmessageqt/networkstatus.py index 5d669f3994..0d2dda1902 100644 --- a/src/bitmessageqt/networkstatus.py +++ b/src/bitmessageqt/networkstatus.py @@ -4,47 +4,43 @@ import time -from PyQt4 import QtCore, QtGui +from PyQt6 import QtCore, QtGui, QtWidgets import l10n import network.stats import state -import widgets +import bitmessageqt.widgets as widgets from network import connectionpool, knownnodes -from retranslateui import RetranslateMixin +from .retranslateui import RetranslateMixin from tr import _translate -from uisignaler import UISignaler +from .uisignaler import UISignaler -class NetworkStatus(QtGui.QWidget, RetranslateMixin): +class NetworkStatus(QtWidgets.QWidget, RetranslateMixin): """Network status tab""" def __init__(self, parent=None): super(NetworkStatus, self).__init__(parent) widgets.load('networkstatus.ui', self) header = self.tableWidgetConnectionCount.horizontalHeader() - header.setResizeMode(QtGui.QHeaderView.ResizeToContents) + header.setSectionResizeMode(QtWidgets.QHeaderView.ResizeMode.ResizeToContents) # Somehow this value was 5 when I tested if header.sortIndicatorSection() > 4: - header.setSortIndicator(0, QtCore.Qt.AscendingOrder) + header.setSortIndicator(0, QtCore.Qt.SortOrder.AscendingOrder) self.startup = time.localtime() self.UISignalThread = UISignaler.get() # pylint: disable=no-member - QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL( - "updateNumberOfMessagesProcessed()"), self.updateNumberOfMessagesProcessed) - QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL( - "updateNumberOfPubkeysProcessed()"), self.updateNumberOfPubkeysProcessed) - QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL( - "updateNumberOfBroadcastsProcessed()"), self.updateNumberOfBroadcastsProcessed) - QtCore.QObject.connect(self.UISignalThread, QtCore.SIGNAL( - "updateNetworkStatusTab(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject)"), self.updateNetworkStatusTab) + self.UISignalThread.updateNumberOfMessagesProcessed.connect(self.updateNumberOfMessagesProcessed) + self.UISignalThread.updateNumberOfPubkeysProcessed.connect(self.updateNumberOfPubkeysProcessed) + self.UISignalThread.updateNumberOfBroadcastsProcessed.connect(self.updateNumberOfBroadcastsProcessed) + self.UISignalThread.updateNetworkStatusTab.connect(self.updateNetworkStatusTab) self.timer = QtCore.QTimer() - QtCore.QObject.connect(self.timer, QtCore.SIGNAL("timeout()"), self.runEveryTwoSeconds) + self.timer.timeout.connect(self.runEveryTwoSeconds) # pylint: enable=no-member def startUpdate(self): @@ -65,7 +61,6 @@ def formatBytes(self, num): "networkstatus", "byte(s)", None, - QtCore.QCoreApplication.CodecForTr, num), "kB", "MB", @@ -89,7 +84,6 @@ def updateNumberOfObjectsToBeSynced(self): "networkstatus", "Object(s) to be synced: %n", None, - QtCore.QCoreApplication.CodecForTr, network.stats.pendingDownload() + network.stats.pendingUpload())) @@ -101,7 +95,6 @@ def updateNumberOfMessagesProcessed(self): "networkstatus", "Processed %n person-to-person message(s).", None, - QtCore.QCoreApplication.CodecForTr, state.numberOfMessagesProcessed)) def updateNumberOfBroadcastsProcessed(self): @@ -112,7 +105,6 @@ def updateNumberOfBroadcastsProcessed(self): "networkstatus", "Processed %n broadcast message(s).", None, - QtCore.QCoreApplication.CodecForTr, state.numberOfBroadcastsProcessed)) def updateNumberOfPubkeysProcessed(self): @@ -123,7 +115,6 @@ def updateNumberOfPubkeysProcessed(self): "networkstatus", "Processed %n public key(s).", None, - QtCore.QCoreApplication.CodecForTr, state.numberOfPubkeysProcessed)) def updateNumberOfBytes(self): diff --git a/src/bitmessageqt/newchandialog.py b/src/bitmessageqt/newchandialog.py index c0629cd797..9632c4f2a3 100644 --- a/src/bitmessageqt/newchandialog.py +++ b/src/bitmessageqt/newchandialog.py @@ -4,18 +4,18 @@ """ -from PyQt4 import QtCore, QtGui +from PyQt6 import QtCore, QtGui, QtWidgets -import widgets +import bitmessageqt.widgets from addresses import addBMIfNotPresent -from addressvalidator import AddressValidator, PassPhraseValidator +from .addressvalidator import AddressValidator, PassPhraseValidator from queues import ( addressGeneratorQueue, apiAddressGeneratorReturnQueue, UISignalQueue) from tr import _translate -from utils import str_chan +from .utils import str_chan -class NewChanDialog(QtGui.QDialog): +class NewChanDialog(QtWidgets.QDialog): """The `New Chan` dialog""" def __init__(self, parent=None): super(NewChanDialog, self).__init__(parent) diff --git a/src/bitmessageqt/retranslateui.py b/src/bitmessageqt/retranslateui.py index c7676f770d..31fc490e42 100644 --- a/src/bitmessageqt/retranslateui.py +++ b/src/bitmessageqt/retranslateui.py @@ -1,7 +1,7 @@ from os import path -from PyQt4 import QtGui +from PyQt6 import QtGui from debug import logger -import widgets +import bitmessageqt.widgets class RetranslateMixin(object): def retranslateUi(self): diff --git a/src/bitmessageqt/safehtmlparser.py b/src/bitmessageqt/safehtmlparser.py index d408d2c701..853fd03103 100644 --- a/src/bitmessageqt/safehtmlparser.py +++ b/src/bitmessageqt/safehtmlparser.py @@ -2,10 +2,9 @@ import inspect import re -from HTMLParser import HTMLParser +from html.parser import HTMLParser -from urllib import quote_plus -from urlparse import urlparse +from urllib.parse import quote_plus, urlparse class SafeHTMLParser(HTMLParser): diff --git a/src/bitmessageqt/settings.py b/src/bitmessageqt/settings.py index 2d56c47f11..b95ee764fa 100644 --- a/src/bitmessageqt/settings.py +++ b/src/bitmessageqt/settings.py @@ -1,13 +1,13 @@ """ This module setting file is for settings """ -import ConfigParser +from configparser import ConfigParser import os import sys import tempfile import six -from PyQt4 import QtCore, QtGui +from PyQt6 import QtCore, QtGui, QtWidgets import debug import defaults @@ -16,7 +16,7 @@ import paths import queues import state -import widgets +import bitmessageqt.widgets from bmconfigparser import config as config_obj from helper_sql import sqlExecute, sqlStoredProcedure from helper_startup import start_proxyconfig @@ -39,7 +39,7 @@ def getSOCKSProxyType(config): return result -class SettingsDialog(QtGui.QDialog): +class SettingsDialog(QtWidgets.QDialog): """The "Settings" dialog""" def __init__(self, parent=None, firstrun=False): super(SettingsDialog, self).__init__(parent) diff --git a/src/bitmessageqt/settingsmixin.py b/src/bitmessageqt/settingsmixin.py index 3d5999e203..fc78f79477 100644 --- a/src/bitmessageqt/settingsmixin.py +++ b/src/bitmessageqt/settingsmixin.py @@ -5,7 +5,7 @@ """ -from PyQt4 import QtCore, QtGui +from PyQt6 import QtCore, QtGui, QtWidgets class SettingsMixin(object): @@ -56,7 +56,7 @@ def readState(self, target): pass -class SMainWindow(QtGui.QMainWindow, SettingsMixin): +class SMainWindow(QtWidgets.QMainWindow, SettingsMixin): """Main window with Settings functionality.""" def loadSettings(self): """Load main window settings.""" @@ -69,7 +69,7 @@ def saveSettings(self): self.writeGeometry(self) -class STableWidget(QtGui.QTableWidget, SettingsMixin): +class STableWidget(QtWidgets.QTableWidget, SettingsMixin): """Table widget with Settings functionality""" # pylint: disable=too-many-ancestors def loadSettings(self): @@ -81,7 +81,7 @@ def saveSettings(self): self.writeState(self.horizontalHeader()) -class SSplitter(QtGui.QSplitter, SettingsMixin): +class SSplitter(QtWidgets.QSplitter, SettingsMixin): """Splitter with Settings functionality.""" def loadSettings(self): """Load splitter settings""" @@ -92,7 +92,7 @@ def saveSettings(self): self.writeState(self) -class STreeWidget(QtGui.QTreeWidget, SettingsMixin): +class STreeWidget(QtWidgets.QTreeWidget, SettingsMixin): """Tree widget with settings functionality.""" # pylint: disable=too-many-ancestors def loadSettings(self): diff --git a/src/bitmessageqt/statusbar.py b/src/bitmessageqt/statusbar.py index 2add604d2c..a7162cc9aa 100644 --- a/src/bitmessageqt/statusbar.py +++ b/src/bitmessageqt/statusbar.py @@ -2,10 +2,10 @@ """Status bar Module""" from time import time -from PyQt4 import QtGui +from PyQt6 import QtGui, QtWidgets -class BMStatusBar(QtGui.QStatusBar): +class BMStatusBar(QtWidgets.QStatusBar): """Status bar with queue and priorities""" duration = 10000 deleteAfter = 60 diff --git a/src/bitmessageqt/support.py b/src/bitmessageqt/support.py index a84affa46c..7215b51b35 100644 --- a/src/bitmessageqt/support.py +++ b/src/bitmessageqt/support.py @@ -6,9 +6,9 @@ import sys import time -from PyQt4 import QtCore +from PyQt6 import QtCore -import account +import bitmessageqt.account import defaults import network.stats import paths @@ -16,12 +16,12 @@ import queues import state from bmconfigparser import config -from foldertree import AccountMixin +from .foldertree import AccountMixin from helper_sql import sqlExecute, sqlQuery from l10n import getTranslationLanguage from openclpow import openclEnabled from pyelliptic.openssl import OpenSSL -from settings import getSOCKSProxyType +from .settings import getSOCKSProxyType from version import softwareVersion from tr import _translate diff --git a/src/bitmessageqt/uisignaler.py b/src/bitmessageqt/uisignaler.py index c23ec3bc42..df30cf1f95 100644 --- a/src/bitmessageqt/uisignaler.py +++ b/src/bitmessageqt/uisignaler.py @@ -1,5 +1,5 @@ -from PyQt4.QtCore import QThread, SIGNAL +from PyQt6.QtCore import QThread, pyqtSignal import sys import queues @@ -11,6 +11,27 @@ class UISignaler(QThread): def __init__(self, parent=None): QThread.__init__(self, parent) + rerenderBlackWhiteList = pyqtSignal() + updateNumberOfMessagesProcessed = pyqtSignal() + updateNumberOfPubkeysProcessed = pyqtSignal() + updateNumberOfBroadcastsProcessed = pyqtSignal() + updateNetworkStatusTab = pyqtSignal(object, object, object) + writeNewAddressToTable = pyqtSignal(object, object, object) + updateStatusBar = pyqtSignal(object) + updateSentItemStatusByToAddress = pyqtSignal(object, object) + updateSentItemStatusByAckdata = pyqtSignal(object, object) + displayNewInboxMessage = pyqtSignal(object, object, object, object, object) + displayNewSentMessage = pyqtSignal(object, object, object, object, object, object) + setStatusIcon = pyqtSignal(object) + changedInboxUnread = pyqtSignal(object) + rerenderMessagelistFromLabels = pyqtSignal() + rerenderMessagelistToLabels = pyqtSignal() + rerenderAddressBook = pyqtSignal() + rerenderSubscriptions = pyqtSignal() + removeInboxRowByMsgid = pyqtSignal(object) + newVersionAvailable = pyqtSignal(object) + displayAlert = pyqtSignal(object, object, object) + @classmethod def get(cls): if not cls._instance: @@ -28,7 +49,7 @@ def run(self): address, str(streamNumber)) elif command == 'updateStatusBar': - self.emit(SIGNAL("updateStatusBar(PyQt_PyObject)"), data) + self.updateStatusBar.emit(data) elif command == 'updateSentItemStatusByToAddress': toAddress, message = data self.emit(SIGNAL( diff --git a/src/bitmessageqt/utils.py b/src/bitmessageqt/utils.py index 9f849b3bb0..3a5b91865c 100644 --- a/src/bitmessageqt/utils.py +++ b/src/bitmessageqt/utils.py @@ -1,7 +1,7 @@ import hashlib import os -from PyQt4 import QtGui +from PyQt6 import QtGui import state from addresses import addBMIfNotPresent @@ -85,11 +85,11 @@ def avatarize(address): if address == str_broadcast_subscribers: # don't hash [Broadcast subscribers] icon_hash = address - # https://www.riverbankcomputing.com/static/Docs/PyQt4/qimagereader.html#supportedImageFormats + # https://doc.qt.io/qt-6/qimagereader.html#supportedImageFormats # QImageReader.supportedImageFormats () extensions = [ - 'PNG', 'GIF', 'JPG', 'JPEG', 'SVG', 'BMP', 'MNG', 'PBM', 'PGM', 'PPM', - 'TIFF', 'XBM', 'XPM', 'TGA'] + 'PNG', 'GIF', 'JPG', 'JPEG', 'SVG', 'BMP', 'PBM', 'PGM', 'PPM', + 'XBM', 'XPM' ] # try to find a specific avatar for ext in extensions: lower_hash = state.appdata + 'avatars/' + icon_hash + '.' + ext.lower() diff --git a/src/bitmessageqt/widgets.py b/src/bitmessageqt/widgets.py index 8ef807f28d..6e9730a005 100644 --- a/src/bitmessageqt/widgets.py +++ b/src/bitmessageqt/widgets.py @@ -1,4 +1,4 @@ -from PyQt4 import uic +from PyQt6 import uic import os.path import paths import sys diff --git a/src/depends.py b/src/depends.py index d966d5fe35..3f08f4d39f 100755 --- a/src/depends.py +++ b/src/depends.py @@ -380,11 +380,11 @@ def check_curses(): def check_pyqt(): """Do pyqt dependency check. - Here we are checking for PyQt4 with its version, as for it require - PyQt 4.8 or later. + Here we are checking for PyQt6 with its version, as for it require + PyQt 6.4 or later. """ QtCore = try_import( - 'PyQt4.QtCore', 'PyBitmessage requires PyQt 4.8 or later and Qt 4.7 or later.') + 'PyQt6.QtCore', 'PyBitmessage requires PyQt 6.4 or later and Qt 6.4 or later.') if not QtCore: return False @@ -433,15 +433,10 @@ def check_dependencies(verbose=False, optional=False): # Python 3+ is not supported, but it is still useful to provide # information about our other requirements. logger.info('Python version: %s', sys.version) - if sys.hexversion < 0x20704F0: + if sys.hexversion < 0x3000000: logger.error( - 'PyBitmessage requires Python 2.7.4 or greater' - ' (but not Python 3+)') - has_all_dependencies = False - if sys.hexversion >= 0x3000000: - logger.error( - 'PyBitmessage does not support Python 3+. Python 2.7.4' - ' or greater is required. Python 2.7.18 is recommended.') + 'PyBitmessage requires Python 3 or greater') + #has_all_dependencies = False sys.exit() # FIXME: This needs to be uncommented when more of the code is python3 compatible diff --git a/src/namecoin.py b/src/namecoin.py index a16cb3d791..c7307cb037 100644 --- a/src/namecoin.py +++ b/src/namecoin.py @@ -4,7 +4,7 @@ # pylint: disable=too-many-branches,protected-access import base64 -import httplib +import http.client import json import os import socket @@ -71,7 +71,7 @@ def __init__(self, options=None): assert self.nmctype == "namecoind" or self.nmctype == "nmcontrol" if self.nmctype == "namecoind": - self.con = httplib.HTTPConnection(self.host, self.port, timeout=3) + self.con = http.client.HTTPConnection(self.host, self.port, timeout=3) def query(self, identity): """ diff --git a/src/network/__init__.py b/src/network/__init__.py index d89670a7be..3cc890c0ef 100644 --- a/src/network/__init__.py +++ b/src/network/__init__.py @@ -12,7 +12,7 @@ def start(config, state): """Start network threads""" import state from .announcethread import AnnounceThread - import connectionpool # pylint: disable=relative-import + import network.connectionpool # pylint: disable=relative-import from .addrthread import AddrThread from .dandelion import Dandelion from .downloadthread import DownloadThread diff --git a/src/network/addrthread.py b/src/network/addrthread.py index 74a5d744f7..4f5de8abc1 100644 --- a/src/network/addrthread.py +++ b/src/network/addrthread.py @@ -5,12 +5,12 @@ # magic imports! import state -import connectionpool +import network.connectionpool from helper_random import randomshuffle from protocol import assembleAddrMessage from queues import addrQueue # FIXME: init with queue -from threads import StoppableThread +from .threads import StoppableThread class AddrThread(StoppableThread): diff --git a/src/network/advanceddispatcher.py b/src/network/advanceddispatcher.py index 49f0d19d7f..33c0c12ed4 100644 --- a/src/network/advanceddispatcher.py +++ b/src/network/advanceddispatcher.py @@ -7,7 +7,7 @@ import network.asyncore_pollchoose as asyncore import state -from threads import BusyError, nonBlocking +from .threads import BusyError, nonBlocking class ProcessingError(Exception): diff --git a/src/network/announcethread.py b/src/network/announcethread.py index 003eb0927c..a5bd37cc9e 100644 --- a/src/network/announcethread.py +++ b/src/network/announcethread.py @@ -5,12 +5,12 @@ # magic imports! import state -import connectionpool +import network.connectionpool as connectionpool from bmconfigparser import config from protocol import assembleAddrMessage -from node import Peer -from threads import StoppableThread +from .node import Peer +from .threads import StoppableThread class AnnounceThread(StoppableThread): diff --git a/src/network/bmproto.py b/src/network/bmproto.py index 41e163dfb9..b800e87b3b 100644 --- a/src/network/bmproto.py +++ b/src/network/bmproto.py @@ -12,10 +12,10 @@ # magic imports! import addresses -import knownnodes +import network.knownnodes import protocol import state -import connectionpool +import network.connectionpool from bmconfigparser import config from queues import invQueue, objectProcessorQueue, portCheckerQueue from randomtrackingdict import RandomTrackingDict @@ -27,8 +27,8 @@ ) from network.proxy import ProxyError -from node import Node, Peer -from objectracker import ObjectTracker, missingObjects +from .node import Node, Peer +from .objectracker import ObjectTracker, missingObjects logger = logging.getLogger('default') diff --git a/src/network/connectionchooser.py b/src/network/connectionchooser.py index d7062d2479..687c43b04f 100644 --- a/src/network/connectionchooser.py +++ b/src/network/connectionchooser.py @@ -5,7 +5,7 @@ import logging import random -import knownnodes +import network.knownnodes import protocol import state from bmconfigparser import config diff --git a/src/network/connectionpool.py b/src/network/connectionpool.py index b756f8a45b..61f20c46a7 100644 --- a/src/network/connectionpool.py +++ b/src/network/connectionpool.py @@ -8,19 +8,19 @@ import sys import time -import asyncore_pollchoose as asyncore +import network.asyncore_pollchoose as asyncore import helper_random -import knownnodes +import network.knownnodes import protocol import state from bmconfigparser import config -from connectionchooser import chooseConnection -from node import Peer -from proxy import Proxy -from tcp import ( +from .connectionchooser import chooseConnection +from .node import Peer +from .proxy import Proxy +from .tcp import ( bootstrap, Socks4aBMConnection, Socks5BMConnection, TCPConnection, TCPServer) -from udp import UDPSocket +from .udp import UDPSocket logger = logging.getLogger('default') @@ -78,7 +78,7 @@ def connections(self): Shortcut for combined list of connections from `inboundConnections` and `outboundConnections` dicts """ - return self.inboundConnections.values() + self.outboundConnections.values() + return list(self.inboundConnections.values()) + list(self.outboundConnections.values()) def establishedConnections(self): """Shortcut for list of connections having fullyEstablished == True""" diff --git a/src/network/dandelion.py b/src/network/dandelion.py index 35e70c95c4..5a7131af82 100644 --- a/src/network/dandelion.py +++ b/src/network/dandelion.py @@ -7,7 +7,7 @@ from threading import RLock from time import time -import connectionpool +import network.connectionpool import state from queues import invQueue @@ -99,12 +99,12 @@ def maybeAddStem(self, connection): with self.lock: if len(self.stem) < MAX_STEMS: self.stem.append(connection) - for k in (k for k, v in self.nodeMap.iteritems() if v is None): + for k in (k for k, v in self.nodeMap.items() if v is None): self.nodeMap[k] = connection for k, v in { - k: v for k, v in self.hashMap.iteritems() + k: v for k, v in self.hashMap.items() if v.child is None - }.iteritems(): + }.items(): self.hashMap[k] = Stem( connection, v.stream, self.poissonTimeout()) invQueue.put((v.stream, k, v.child)) @@ -120,14 +120,14 @@ def maybeRemoveStem(self, connection): self.stem.remove(connection) # active mappings to pointing to the removed node for k in ( - k for k, v in self.nodeMap.iteritems() + k for k, v in self.nodeMap.items() if v == connection ): self.nodeMap[k] = None for k, v in { - k: v for k, v in self.hashMap.iteritems() + k: v for k, v in self.hashMap.items() if v.child == connection - }.iteritems(): + }.items(): self.hashMap[k] = Stem( None, v.stream, self.poissonTimeout()) @@ -168,7 +168,7 @@ def expire(self): with self.lock: deadline = time() toDelete = [ - [v.stream, k, v.child] for k, v in self.hashMap.iteritems() + [v.stream, k, v.child] for k, v in self.hashMap.items() if v.timeout < deadline ] diff --git a/src/network/downloadthread.py b/src/network/downloadthread.py index 4f108c724d..3c87bc0329 100644 --- a/src/network/downloadthread.py +++ b/src/network/downloadthread.py @@ -6,9 +6,9 @@ import addresses import helper_random import protocol -import connectionpool -from objectracker import missingObjects -from threads import StoppableThread +import network.connectionpool +from .objectracker import missingObjects +from .threads import StoppableThread class DownloadThread(StoppableThread): @@ -28,7 +28,7 @@ def cleanPending(self): deadline = time.time() - self.requestExpires try: toDelete = [ - k for k, v in missingObjects.iteritems() + k for k, v in missingObjects.items() if v < deadline] except RuntimeError: pass diff --git a/src/network/invthread.py b/src/network/invthread.py index b55408d436..99b04baea9 100644 --- a/src/network/invthread.py +++ b/src/network/invthread.py @@ -1,16 +1,16 @@ """ Thread to send inv annoucements """ -import Queue +import queue import random from time import time import addresses import protocol import state -import connectionpool +import network.connectionpool from queues import invQueue -from threads import StoppableThread +from .threads import StoppableThread def handleExpiredDandelion(expired): @@ -58,7 +58,7 @@ def run(self): # pylint: disable=too-many-branches # locally generated if len(data) == 2 or data[2] is None: self.handleLocallyGenerated(data[0], data[1]) - except Queue.Empty: + except queue.Empty: break if chunk: diff --git a/src/network/knownnodes.py b/src/network/knownnodes.py index b74c9a15ef..01aa4729fd 100644 --- a/src/network/knownnodes.py +++ b/src/network/knownnodes.py @@ -54,8 +54,8 @@ def json_serialize_knownnodes(output): Reorganize knownnodes dict and write it as JSON to output """ _serialized = [] - for stream, peers in knownNodes.iteritems(): - for peer, info in peers.iteritems(): + for stream, peers in knownNodes.items(): + for peer, info in peers.items(): info.update(rating=round(info.get('rating', 0), 2)) _serialized.append({ 'stream': stream, 'peer': peer._asdict(), 'info': info @@ -87,7 +87,7 @@ def pickle_deserialize_old_knownnodes(source): global knownNodes knownNodes = pickle.load(source) # nosec B301 for stream in knownNodes.keys(): - for node, params in knownNodes[stream].iteritems(): + for node, params in knownNodes[stream].items(): if isinstance(params, (float, int)): addKnownNode(stream, node, params) @@ -97,7 +97,7 @@ def saveKnownNodes(dirName=None): if dirName is None: dirName = state.appdata with knownNodesLock: - with open(os.path.join(dirName, 'knownnodes.dat'), 'wb') as output: + with open(os.path.join(dirName, 'knownnodes.dat'), 'w') as output: json_serialize_knownnodes(output) diff --git a/src/network/networkthread.py b/src/network/networkthread.py index dc5f616fc2..298e41e7e4 100644 --- a/src/network/networkthread.py +++ b/src/network/networkthread.py @@ -3,9 +3,9 @@ """ import network.asyncore_pollchoose as asyncore import state -import connectionpool +import network.connectionpool from queues import excQueue -from threads import StoppableThread +from .threads import StoppableThread class BMNetworkThread(StoppableThread): diff --git a/src/network/objectracker.py b/src/network/objectracker.py index a458e5d2f6..3fe9444ff4 100644 --- a/src/network/objectracker.py +++ b/src/network/objectracker.py @@ -5,7 +5,7 @@ from threading import RLock import state -import connectionpool +import network.connectionpool from randomtrackingdict import RandomTrackingDict haveBloom = False @@ -75,7 +75,7 @@ def clean(self): with self.objectsNewToThemLock: self.objectsNewToThem = { k: v - for k, v in self.objectsNewToThem.iteritems() + for k, v in self.objectsNewToThem.items() if v >= deadline} self.lastCleaned = time.time() diff --git a/src/network/proxy.py b/src/network/proxy.py index ed1af127b2..08a93dad08 100644 --- a/src/network/proxy.py +++ b/src/network/proxy.py @@ -6,10 +6,10 @@ import socket import time -import asyncore_pollchoose as asyncore -from advanceddispatcher import AdvancedDispatcher +import network.asyncore_pollchoose as asyncore +from .advanceddispatcher import AdvancedDispatcher from bmconfigparser import config -from node import Peer +from .node import Peer logger = logging.getLogger('default') diff --git a/src/network/receivequeuethread.py b/src/network/receivequeuethread.py index cad1376c0e..6c755577d2 100644 --- a/src/network/receivequeuethread.py +++ b/src/network/receivequeuethread.py @@ -2,14 +2,14 @@ Process data incoming from network """ import errno -import Queue +import queue import socket import state -import connectionpool +import network.connectionpool from network.advanceddispatcher import UnknownStateError from queues import receiveDataQueue -from threads import StoppableThread +from .threads import StoppableThread class ReceiveQueueThread(StoppableThread): @@ -22,7 +22,7 @@ def run(self): while not self._stopped and state.shutdown == 0: try: dest = receiveDataQueue.get(block=True, timeout=1) - except Queue.Empty: + except queue.Empty: continue if self._stopped or state.shutdown: diff --git a/src/network/socks4a.py b/src/network/socks4a.py index e978616840..2758838a27 100644 --- a/src/network/socks4a.py +++ b/src/network/socks4a.py @@ -6,7 +6,7 @@ import socket import struct -from proxy import GeneralProxyError, Proxy, ProxyError +from .proxy import GeneralProxyError, Proxy, ProxyError logger = logging.getLogger('default') diff --git a/src/network/socks5.py b/src/network/socks5.py index d1daae4226..1838a737fa 100644 --- a/src/network/socks5.py +++ b/src/network/socks5.py @@ -7,8 +7,8 @@ import socket import struct -from node import Peer -from proxy import GeneralProxyError, Proxy, ProxyError +from .node import Peer +from .proxy import GeneralProxyError, Proxy, ProxyError logger = logging.getLogger('default') diff --git a/src/network/stats.py b/src/network/stats.py index 0ab1ae0fd4..217ecc0843 100644 --- a/src/network/stats.py +++ b/src/network/stats.py @@ -3,9 +3,9 @@ """ import time -import asyncore_pollchoose as asyncore -import connectionpool -from objectracker import missingObjects +import network.asyncore_pollchoose as asyncore +import network.connectionpool +from .objectracker import missingObjects lastReceivedTimestamp = time.time() diff --git a/src/network/tcp.py b/src/network/tcp.py index 139715a6ef..267a3e2299 100644 --- a/src/network/tcp.py +++ b/src/network/tcp.py @@ -15,21 +15,21 @@ import l10n import protocol import state -import connectionpool +import network.connectionpool from bmconfigparser import config from highlevelcrypto import randomBytes from queues import invQueue, receiveDataQueue, UISignalQueue from tr import _translate -import asyncore_pollchoose as asyncore -import knownnodes +import network.asyncore_pollchoose as asyncore +import network.knownnodes from network.advanceddispatcher import AdvancedDispatcher from network.bmproto import BMProto from network.objectracker import ObjectTracker from network.socks4a import Socks4aConnection from network.socks5 import Socks5Connection from network.tls import TLSDispatcher -from node import Peer +from .node import Peer logger = logging.getLogger('default') @@ -191,7 +191,7 @@ def sendAddr(self): # only if more recent than 3 hours # and having positive or neutral rating filtered = [ - (k, v) for k, v in nodes.iteritems() + (k, v) for k, v in nodes.items() if v["lastseen"] > int(time.time()) - maximumAgeOfNodesThatIAdvertiseToOthers and v["rating"] >= 0 and not k.host.endswith('.onion') diff --git a/src/network/tls.py b/src/network/tls.py index a3774b4422..7d76c48edd 100644 --- a/src/network/tls.py +++ b/src/network/tls.py @@ -34,7 +34,7 @@ # ciphers if ( ssl.OPENSSL_VERSION_NUMBER >= 0x10100000 - and not ssl.OPENSSL_VERSION.startswith(b"LibreSSL") + and not ssl.OPENSSL_VERSION.startswith("LibreSSL") ): sslProtocolCiphers = "AECDH-AES256-SHA@SECLEVEL=0" else: diff --git a/src/network/udp.py b/src/network/udp.py index 1a9891ec84..e0c1570228 100644 --- a/src/network/udp.py +++ b/src/network/udp.py @@ -10,9 +10,9 @@ import state from queues import receiveDataQueue -from bmproto import BMProto -from node import Peer -from objectracker import ObjectTracker +from .bmproto import BMProto +from .node import Peer +from .objectracker import ObjectTracker logger = logging.getLogger('default') diff --git a/src/network/uploadthread.py b/src/network/uploadthread.py index 90048c0a7d..6b76e58527 100644 --- a/src/network/uploadthread.py +++ b/src/network/uploadthread.py @@ -6,9 +6,9 @@ import helper_random import protocol import state -import connectionpool +import network.connectionpool as connectionpool from randomtrackingdict import RandomTrackingDict -from threads import StoppableThread +from .threads import StoppableThread class UploadThread(StoppableThread): diff --git a/src/tr.py b/src/tr.py index eec82c37d3..6aca4664e9 100644 --- a/src/tr.py +++ b/src/tr.py @@ -41,7 +41,7 @@ def translateText(context, text, n=None): enableGUI = True if enableGUI: try: - from PyQt4 import QtCore, QtGui + from PyQt6 import QtCore, QtGui, QtWidgets except Exception as err: print('PyBitmessage requires PyQt unless you want to run it as a daemon' ' and interact with it using the API.' @@ -51,7 +51,7 @@ def translateText(context, text, n=None): print('Error message:', err) os._exit(0) # pylint: disable=protected-access if n is None: - return QtGui.QApplication.translate(context, text) + return QtWidgets.QApplication.translate(context, text) return QtGui.QApplication.translate(context, text, None, QtCore.QCoreApplication.CodecForTr, n) else: if '%' in text: diff --git a/start.sh b/start.sh index 75ed7af3d5..bf571e1237 100755 --- a/start.sh +++ b/start.sh @@ -1,3 +1,3 @@ #!/bin/sh -python2 pybitmessage/bitmessagemain.py "$@" +python3 pybitmessage/bitmessagemain.py "$@" From 057e856925ef999de7c8fd6484ce199a81c8bf77 Mon Sep 17 00:00:00 2001 From: Kashiko Koibumi Date: Mon, 13 May 2024 12:47:42 +0900 Subject: [PATCH 02/32] try to migrate to Python3 + PyQt6; part 2 TLS is disabled --- src/bitmessageqt/__init__.py | 288 +++++++++--------- src/bitmessageqt/bitmessageui.py | 21 +- ...bitmessageui.diff => bitmessageui.py.diff} | 75 ++++- src/bitmessageqt/bitmessageui.py.orig | 1 + src/bitmessageqt/bitmessageui.ui | 8 + src/bitmessageqt/foldertree.py | 44 +-- src/bitmessageqt/networkstatus.py | 36 +-- src/bitmessageqt/retranslateui.py | 10 +- src/bitmessageqt/settings.py | 2 +- src/bitmessageqt/uisignaler.py | 56 ++-- src/bitmessageqt/utils.py | 6 +- src/class_singleWorker.py | 2 +- src/network/__init__.py | 2 +- src/network/addrthread.py | 2 +- src/network/asyncore_pollchoose.py | 25 +- src/network/bmproto.py | 55 ++-- src/network/connectionchooser.py | 4 +- src/network/connectionpool.py | 6 +- src/network/dandelion.py | 2 +- src/network/downloadthread.py | 4 +- src/network/invthread.py | 6 +- src/network/networkthread.py | 2 +- src/network/objectracker.py | 2 +- src/network/receivequeuethread.py | 2 +- src/network/stats.py | 2 +- src/network/tcp.py | 17 +- src/network/uploadthread.py | 2 +- src/protocol.py | 4 +- src/qidenticon.py | 19 +- src/shutdown.py | 2 +- src/storage/sqlite.py | 6 +- src/tr.py | 4 +- 32 files changed, 391 insertions(+), 326 deletions(-) rename src/bitmessageqt/{bitmessageui.diff => bitmessageui.py.diff} (65%) diff --git a/src/bitmessageqt/__init__.py b/src/bitmessageqt/__init__.py index f7a60b3de9..3e66c364e4 100644 --- a/src/bitmessageqt/__init__.py +++ b/src/bitmessageqt/__init__.py @@ -609,12 +609,12 @@ def __init__(self, parent=None): if addressVersionNumber == 1: displayMsg = _translate( "MainWindow", - "One of your addresses, %1, is an old version 1 address. " + "One of your addresses, {0}, is an old version 1 address. " "Version 1 addresses are no longer supported. " - "May we delete it now?").arg(addressInKeysFile) + "May we delete it now?").format(addressInKeysFile) reply = QtGui.QMessageBox.question( - self, 'Message', displayMsg, QtGui.QMessageBox.Yes, QtGui.QMessageBox.No) - if reply == QtGui.QMessageBox.Yes: + self, 'Message', displayMsg, QtGui.QMessageBox.StandardButton.Yes, QtGui.QMessageBox.StandardButton.No) + if reply == QtGui.QMessageBox.StandardButton.Yes: config.remove_section(addressInKeysFile) config.save() @@ -1062,20 +1062,20 @@ def addMessageListItemSent( elif status == 'msgsent': statusText = _translate( "MainWindow", - "Message sent. Waiting for acknowledgement. Sent at %1" - ).arg(l10n.formatTimestamp(lastactiontime)) + "Message sent. Waiting for acknowledgement. Sent at {0}" + ).format(l10n.formatTimestamp(lastactiontime)) elif status == 'msgsentnoackexpected': statusText = _translate( - "MainWindow", "Message sent. Sent at %1" - ).arg(l10n.formatTimestamp(lastactiontime)) + "MainWindow", "Message sent. Sent at {0}" + ).format(l10n.formatTimestamp(lastactiontime)) elif status == 'doingmsgpow': statusText = _translate( "MainWindow", "Doing work necessary to send message.") elif status == 'ackreceived': statusText = _translate( "MainWindow", - "Acknowledgement of the message received %1" - ).arg(l10n.formatTimestamp(lastactiontime)) + "Acknowledgement of the message received {0}" + ).format(l10n.formatTimestamp(lastactiontime)) elif status == 'broadcastqueued': statusText = _translate( "MainWindow", "Broadcast queued.") @@ -1083,27 +1083,27 @@ def addMessageListItemSent( statusText = _translate( "MainWindow", "Doing work necessary to send broadcast.") elif status == 'broadcastsent': - statusText = _translate("MainWindow", "Broadcast on %1").arg( + statusText = _translate("MainWindow", "Broadcast on {0}").format( l10n.formatTimestamp(lastactiontime)) elif status == 'toodifficult': statusText = _translate( "MainWindow", "Problem: The work demanded by the recipient is more" - " difficult than you are willing to do. %1" - ).arg(l10n.formatTimestamp(lastactiontime)) + " difficult than you are willing to do. {0}" + ).format(l10n.formatTimestamp(lastactiontime)) elif status == 'badkey': statusText = _translate( "MainWindow", "Problem: The recipient\'s encryption key is no good." - " Could not encrypt message. %1" - ).arg(l10n.formatTimestamp(lastactiontime)) + " Could not encrypt message. {0}" + ).format(l10n.formatTimestamp(lastactiontime)) elif status == 'forcepow': statusText = _translate( "MainWindow", "Forced difficulty override. Send should start soon.") else: statusText = _translate( - "MainWindow", "Unknown status: %1 %2").arg(status).arg( + "MainWindow", "Unknown status: {0} {1}").format(status, l10n.formatTimestamp(lastactiontime)) items = [ @@ -1387,7 +1387,7 @@ def _noop_update(*args, **kwargs): def notifierInit(self): def _simple_notify( title, subtitle, category, label=None, icon=None): - self.tray.showMessage(title, subtitle, 1, 2000) + self.tray.showMessage(title, subtitle, icon, 2000) self._notifier = _simple_notify # does nothing if isAvailable returns false @@ -1504,7 +1504,7 @@ def click_actionManageKeys(self): # reply = QtGui.QMessageBox.information(self, 'keys.dat?','You # may manage your keys by editing the keys.dat file stored in # the same directory as this program. It is important that you - # back up this file.', QMessageBox.Ok) + # back up this file.', QMessageBox.StandardButton.Ok) reply = QtGui.QMessageBox.information( self, 'keys.dat?', @@ -1513,7 +1513,7 @@ def click_actionManageKeys(self): "You may manage your keys by editing the keys.dat file stored in the same directory" "as this program. It is important that you back up this file." ), - QtGui.QMessageBox.Ok) + QtGui.QMessageBox.StandardButton.Ok) else: QtGui.QMessageBox.information( @@ -1522,10 +1522,10 @@ def click_actionManageKeys(self): _translate( "MainWindow", "You may manage your keys by editing the keys.dat file stored in" - "\n %1 \n" + "\n {0} \n" "It is important that you back up this file." - ).arg(state.appdata), - QtGui.QMessageBox.Ok) + ).format(state.appdata), + QtGui.QMessageBox.StandardButton.Ok) elif sys.platform == 'win32' or sys.platform == 'win64': if state.appdata == '': reply = QtGui.QMessageBox.question( @@ -1537,19 +1537,19 @@ def click_actionManageKeys(self): "this program. It is important that you back up this file. " "Would you like to open the file now? " "(Be sure to close Bitmessage before making any changes.)"), - QtGui.QMessageBox.Yes, - QtGui.QMessageBox.No) + QtGui.QMessageBox.StandardButton.Yes, + QtGui.QMessageBox.StandardButton.No) else: reply = QtGui.QMessageBox.question( self, _translate("MainWindow", "Open keys.dat?"), _translate( "MainWindow", - "You may manage your keys by editing the keys.dat file stored in\n %1 \n" + "You may manage your keys by editing the keys.dat file stored in\n {0} \n" "It is important that you back up this file. Would you like to open the file now?" - "(Be sure to close Bitmessage before making any changes.)").arg(state.appdata), - QtGui.QMessageBox.Yes, QtGui.QMessageBox.No) - if reply == QtGui.QMessageBox.Yes: + "(Be sure to close Bitmessage before making any changes.)").format(state.appdata), + QtGui.QMessageBox.StandardButton.Yes, QtGui.QMessageBox.StandardButton.No) + if reply == QtGui.QMessageBox.StandardButton.Yes: openKeysFile() # menu button 'delete all treshed messages' @@ -1558,8 +1558,8 @@ def click_actionDeleteAllTrashedMessages(self): self, _translate("MainWindow", "Delete trash?"), _translate("MainWindow", "Are you sure you want to delete all trashed messages?"), - QtGui.QMessageBox.Yes, - QtGui.QMessageBox.No) == QtGui.QMessageBox.No: + QtGui.QMessageBox.StandardButton.Yes, + QtGui.QMessageBox.StandardButton.No) == QtGui.QMessageBox.StandardButton.No: return sqlStoredProcedure('deleteandvacuume') self.rerenderTabTreeMessages() @@ -1654,7 +1654,7 @@ def showMigrationWizard(self, level): pass def changeEvent(self, event): - if event.type() == QtCore.QEvent.LanguageChange: + if event.type() == QtCore.QEvent.Type.LanguageChange: self.ui.retranslateUi(self) self.init_inbox_popup_menu(False) self.init_identities_popup_menu(False) @@ -1663,7 +1663,7 @@ def changeEvent(self, event): self.init_subscriptions_popup_menu(False) self.init_sent_popup_menu(False) self.ui.blackwhitelist.init_blacklist_popup_menu(False) - if event.type() == QtCore.QEvent.WindowStateChange: + if event.type() == QtCore.QEvent.Type.WindowStateChange: if self.windowState() & QtCore.Qt.WindowMinimized: if config.getboolean('bitmessagesettings', 'minimizetotray') and not 'darwin' in sys.platform: QtCore.QTimer.singleShot(0, self.appIndicatorHide) @@ -1890,14 +1890,14 @@ def newVersionAvailable(self, version): self.notifiedNewVersion = ".".join(str(n) for n in version) self.updateStatusBar(_translate( "MainWindow", - "New version of PyBitmessage is available: %1. Download it" + "New version of PyBitmessage is available: {0}. Download it" " from https://github.com/Bitmessage/PyBitmessage/releases/latest" - ).arg(self.notifiedNewVersion) + ).format(self.notifiedNewVersion) ) def displayAlert(self, title, text, exitAfterUserClicksOk): self.updateStatusBar(text) - QtGui.QMessageBox.critical(self, title, text, QtGui.QMessageBox.Ok) + QtGui.QMessageBox.critical(self, title, text, QtGui.QMessageBox.StandardButton.Ok) if exitAfterUserClicksOk: os._exit(0) @@ -1982,7 +1982,7 @@ def click_pushButtonTTL(self): ,it will resend the message automatically. The longer the Time-To-Live, the more work your computer must do to send the message. A Time-To-Live of four or five days is often appropriate."""), - QtGui.QMessageBox.Ok) + QtGui.QMessageBox.StandardButton.Ok) def click_pushButtonClear(self): self.ui.lineEditSubject.setText("") @@ -2028,9 +2028,9 @@ def click_pushButtonSend(self): _translate( "MainWindow", "The message that you are trying to send is too long" - " by %1 bytes. (The maximum is 261644 bytes). Please" + " by {0} bytes. (The maximum is 261644 bytes). Please" " cut it down before sending." - ).arg(len(message) - (2 ** 18 - 500))) + ).format(len(message) - (2 ** 18 - 500))) return acct = accountClass(fromAddress) @@ -2062,7 +2062,7 @@ def click_pushButtonSend(self): "MainWindow", "You are trying to send an email instead of a bitmessage. " "This requires registering with a gateway. Attempt to register?"), - QtGui.QMessageBox.Yes|QtGui.QMessageBox.No) != QtGui.QMessageBox.Yes: + QtGui.QMessageBox.StandardButton.Yes|QtGui.QMessageBox.StandardButton.No) != QtGui.QMessageBox.StandardButton.Yes: continue email = acct.getLabel() if email[-14:] != "@mailchuck.com": # attempt register @@ -2079,9 +2079,9 @@ def click_pushButtonSend(self): "MainWindow", "Error: Your account wasn't registered at" " an email gateway. Sending registration" - " now as %1, please wait for the registration" + " now as {0}, please wait for the registration" " to be processed before retrying sending." - ).arg(email) + ).format(email) ) return status, addressVersionNumber, streamNumber = decodeAddress(toAddress)[:3] @@ -2096,58 +2096,58 @@ def click_pushButtonSend(self): self.updateStatusBar(_translate( "MainWindow", "Error: Bitmessage addresses start with" - " BM- Please check the recipient address %1" - ).arg(toAddress)) + " BM- Please check the recipient address {0}" + ).format(toAddress)) elif status == 'checksumfailed': self.updateStatusBar(_translate( "MainWindow", - "Error: The recipient address %1 is not" + "Error: The recipient address {0} is not" " typed or copied correctly. Please check it." - ).arg(toAddress)) + ).format(toAddress)) elif status == 'invalidcharacters': self.updateStatusBar(_translate( "MainWindow", - "Error: The recipient address %1 contains" + "Error: The recipient address {0} contains" " invalid characters. Please check it." - ).arg(toAddress)) + ).format(toAddress)) elif status == 'versiontoohigh': self.updateStatusBar(_translate( "MainWindow", "Error: The version of the recipient address" - " %1 is too high. Either you need to upgrade" + " {0} is too high. Either you need to upgrade" " your Bitmessage software or your" " acquaintance is being clever." - ).arg(toAddress)) + ).format(toAddress)) elif status == 'ripetooshort': self.updateStatusBar(_translate( "MainWindow", "Error: Some data encoded in the recipient" - " address %1 is too short. There might be" + " address {0} is too short. There might be" " something wrong with the software of" " your acquaintance." - ).arg(toAddress)) + ).format(toAddress)) elif status == 'ripetoolong': self.updateStatusBar(_translate( "MainWindow", "Error: Some data encoded in the recipient" - " address %1 is too long. There might be" + " address {0} is too long. There might be" " something wrong with the software of" " your acquaintance." - ).arg(toAddress)) + ).format(toAddress)) elif status == 'varintmalformed': self.updateStatusBar(_translate( "MainWindow", "Error: Some data encoded in the recipient" - " address %1 is malformed. There might be" + " address {0} is malformed. There might be" " something wrong with the software of" " your acquaintance." - ).arg(toAddress)) + ).format(toAddress)) else: self.updateStatusBar(_translate( "MainWindow", "Error: Something is wrong with the" - " recipient address %1." - ).arg(toAddress)) + " recipient address {0}." + ).format(toAddress)) elif fromAddress == '': self.updateStatusBar(_translate( "MainWindow", @@ -2164,9 +2164,9 @@ def click_pushButtonSend(self): _translate("MainWindow", "Address version number"), _translate( "MainWindow", - "Concerning the address %1, Bitmessage cannot understand address version numbers" - " of %2. Perhaps upgrade Bitmessage to the latest version." - ).arg(toAddress).arg(str(addressVersionNumber))) + "Concerning the address {0}, Bitmessage cannot understand address version numbers" + " of {1}. Perhaps upgrade Bitmessage to the latest version." + ).format(toAddress, str(addressVersionNumber))) continue if streamNumber > 1 or streamNumber == 0: QtGui.QMessageBox.about( @@ -2174,9 +2174,9 @@ def click_pushButtonSend(self): _translate("MainWindow", "Stream number"), _translate( "MainWindow", - "Concerning the address %1, Bitmessage cannot handle stream numbers of %2." + "Concerning the address {0}, Bitmessage cannot handle stream numbers of {1}." " Perhaps upgrade Bitmessage to the latest version." - ).arg(toAddress).arg(str(streamNumber))) + ).format(toAddress, str(streamNumber))) continue self.statusbar.clearMessage() if state.statusIconColor == 'red': @@ -2265,7 +2265,7 @@ def click_pushButtonFetchNamecoinID(self): err, addr = self.namecoin.query(identities[-1].strip()) if err is not None: self.updateStatusBar( - _translate("MainWindow", "Error: %1").arg(err)) + _translate("MainWindow", "Error: {0}").format(err)) else: identities[-1] = addr self.ui.lineEditTo.setText("; ".join(identities)) @@ -2420,7 +2420,7 @@ def displayNewInboxMessage( 'bitmessagesettings', 'showtraynotifications'): self.notifierShow( _translate("MainWindow", "New Message"), - _translate("MainWindow", "From %1").arg( + _translate("MainWindow", "From {0}").format( str(acct.fromLabel, 'utf-8')), sound.SOUND_UNKNOWN ) @@ -2583,8 +2583,8 @@ def on_action_MarkAllRead(self): _translate( "MainWindow", "Are you sure you would like to mark all messages read?" - ), QtGui.QMessageBox.Yes | QtGui.QMessageBox.No - ) != QtGui.QMessageBox.Yes: + ), QtGui.QMessageBox.StandardButton.Yes | QtGui.QMessageBox.StandardButton.No + ) != QtGui.QMessageBox.StandardButton.Yes: return tableWidget = self.getCurrentMessagelist() @@ -2612,7 +2612,7 @@ def click_NewAddressDialog(self): def network_switch(self): dontconnect_option = not config.safeGetBoolean( 'bitmessagesettings', 'dontconnect') - reply = QtGui.QMessageBox.question( + reply = QtWidgets.QMessageBox.question( self, _translate("MainWindow", "Disconnecting") if dontconnect_option else _translate("MainWindow", "Connecting"), _translate( @@ -2621,9 +2621,9 @@ def network_switch(self): ) if dontconnect_option else _translate( "MainWindow", "Bitmessage will now start connecting to network. Are you sure?" - ), QtGui.QMessageBox.Yes | QtGui.QMessageBox.Cancel, - QtGui.QMessageBox.Cancel) - if reply != QtGui.QMessageBox.Yes: + ), QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.Cancel, + QtWidgets.QMessageBox.StandardButton.Cancel) + if reply != QtWidgets.QMessageBox.StandardButton.Yes: return config.set( 'bitmessagesettings', 'dontconnect', str(dontconnect_option)) @@ -2650,7 +2650,7 @@ def quit(self): # C PoW currently doesn't support interrupting and OpenCL is untested if getPowType() == "python" and (powQueueSize() > 0 or pendingUpload() > 0): - reply = QtGui.QMessageBox.question( + reply = QtWidgets.QMessageBox.question( self, _translate("MainWindow", "Proof of work pending"), _translate( "MainWindow", @@ -2664,15 +2664,15 @@ def quit(self): ) + "\n\n" + _translate( "MainWindow", "Wait until these tasks finish?"), - QtGui.QMessageBox.Yes | QtGui.QMessageBox.No - | QtGui.QMessageBox.Cancel, QtGui.QMessageBox.Cancel) - if reply == QtGui.QMessageBox.No: + QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No + | QtWidgets.QMessageBox.StandardButton.Cancel, QtWidgets.QMessageBox.StandardButton.Cancel) + if reply == QtWidgets.QMessageBox.StandardButton.No: waitForPow = False - elif reply == QtGui.QMessageBox.Cancel: + elif reply == QtWidgets.QMessageBox.StandardButton.Cancel: return if pendingDownload() > 0: - reply = QtGui.QMessageBox.question( + reply = QtWidgets.QMessageBox.question( self, _translate("MainWindow", "Synchronisation pending"), _translate( "MainWindow", @@ -2682,16 +2682,16 @@ def quit(self): " synchronisation finishes?", None, QtCore.QCoreApplication.CodecForTr, pendingDownload() ), - QtGui.QMessageBox.Yes | QtGui.QMessageBox.No - | QtGui.QMessageBox.Cancel, QtGui.QMessageBox.Cancel) - if reply == QtGui.QMessageBox.Yes: + QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No + | QtWidgets.QMessageBox.StandardButton.Cancel, QtWidgets.QMessageBox.StandardButton.Cancel) + if reply == QtWidgets.QMessageBox.StandardButton.Yes: self.wait = waitForSync = True - elif reply == QtGui.QMessageBox.Cancel: + elif reply == QtWidgets.QMessageBox.StandardButton.Cancel: return if state.statusIconColor == 'red' and not config.safeGetBoolean( 'bitmessagesettings', 'dontconnect'): - reply = QtGui.QMessageBox.question( + reply = QtWidgets.QMessageBox.question( self, _translate("MainWindow", "Not connected"), _translate( "MainWindow", @@ -2699,18 +2699,18 @@ def quit(self): " quit now, it may cause delivery delays. Wait until" " connected and the synchronisation finishes?" ), - QtGui.QMessageBox.Yes | QtGui.QMessageBox.No - | QtGui.QMessageBox.Cancel, QtGui.QMessageBox.Cancel) - if reply == QtGui.QMessageBox.Yes: + QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No + | QtWidgets.QMessageBox.StandardButton.Cancel, QtWidgets.QMessageBox.StandardButton.Cancel) + if reply == QtWidgets.QMessageBox.StandardButton.Yes: waitForConnection = True self.wait = waitForSync = True - elif reply == QtGui.QMessageBox.Cancel: + elif reply == QtWidgets.QMessageBox.StandardButton.Cancel: return self.quitAccepted = True self.updateStatusBar(_translate( - "MainWindow", "Shutting down PyBitmessage... %1%").arg(0)) + "MainWindow", "Shutting down PyBitmessage... {0}%").format(0)) if waitForConnection: self.updateStatusBar(_translate( @@ -2718,7 +2718,7 @@ def quit(self): while state.statusIconColor == 'red': time.sleep(0.5) QtCore.QCoreApplication.processEvents( - QtCore.QEventLoop.AllEvents, 1000 + QtCore.QEventLoop.ProcessEventsFlag.AllEvents, 1000 ) # this probably will not work correctly, because there is a delay @@ -2730,7 +2730,7 @@ def quit(self): while pendingDownload() > 0: time.sleep(0.5) QtCore.QCoreApplication.processEvents( - QtCore.QEventLoop.AllEvents, 1000 + QtCore.QEventLoop.ProcessEventsFlag.AllEvents, 1000 ) if waitForPow: @@ -2744,54 +2744,54 @@ def quit(self): maxWorkerQueue = curWorkerQueue if curWorkerQueue > 0: self.updateStatusBar(_translate( - "MainWindow", "Waiting for PoW to finish... %1%" - ).arg(50 * (maxWorkerQueue - curWorkerQueue) / + "MainWindow", "Waiting for PoW to finish... {0}%" + ).format(50 * (maxWorkerQueue - curWorkerQueue) / maxWorkerQueue)) time.sleep(0.5) QtCore.QCoreApplication.processEvents( - QtCore.QEventLoop.AllEvents, 1000 + QtCore.QEventLoop.ProcessEventsFlag.AllEvents, 1000 ) self.updateStatusBar(_translate( - "MainWindow", "Shutting down Pybitmessage... %1%").arg(50)) + "MainWindow", "Shutting down Pybitmessage... {0}%").format(50)) QtCore.QCoreApplication.processEvents( - QtCore.QEventLoop.AllEvents, 1000 + QtCore.QEventLoop.ProcessEventsFlag.AllEvents, 1000 ) if maxWorkerQueue > 0: # a bit of time so that the hashHolder is populated time.sleep(0.5) QtCore.QCoreApplication.processEvents( - QtCore.QEventLoop.AllEvents, 1000 + QtCore.QEventLoop.ProcessEventsFlag.AllEvents, 1000 ) # check if upload (of objects created locally) pending self.updateStatusBar(_translate( - "MainWindow", "Waiting for objects to be sent... %1%").arg(50)) + "MainWindow", "Waiting for objects to be sent... {0}%").format(50)) maxPendingUpload = max(1, pendingUpload()) while pendingUpload() > 1: self.updateStatusBar(_translate( "MainWindow", - "Waiting for objects to be sent... %1%" - ).arg(int(50 + 20 * (pendingUpload() / maxPendingUpload)))) + "Waiting for objects to be sent... {0}%" + ).format(int(50 + 20 * (pendingUpload() / maxPendingUpload)))) time.sleep(0.5) QtCore.QCoreApplication.processEvents( - QtCore.QEventLoop.AllEvents, 1000 + QtCore.QEventLoop.ProcessEventsFlag.AllEvents, 1000 ) QtCore.QCoreApplication.processEvents( - QtCore.QEventLoop.AllEvents, 1000 + QtCore.QEventLoop.ProcessEventsFlag.AllEvents, 1000 ) QtCore.QCoreApplication.processEvents( - QtCore.QEventLoop.AllEvents, 1000 + QtCore.QEventLoop.ProcessEventsFlag.AllEvents, 1000 ) # save state and geometry self and all widgets self.updateStatusBar(_translate( - "MainWindow", "Saving settings... %1%").arg(70)) + "MainWindow", "Saving settings... {0}%").format(70)) QtCore.QCoreApplication.processEvents( - QtCore.QEventLoop.AllEvents, 1000 + QtCore.QEventLoop.ProcessEventsFlag.AllEvents, 1000 ) self.saveSettings() for attr, obj in self.ui.__dict__.items(): @@ -2802,18 +2802,18 @@ def quit(self): obj.saveSettings() self.updateStatusBar(_translate( - "MainWindow", "Shutting down core... %1%").arg(80)) + "MainWindow", "Shutting down core... {0}%").format(80)) QtCore.QCoreApplication.processEvents( - QtCore.QEventLoop.AllEvents, 1000 + QtCore.QEventLoop.ProcessEventsFlag.AllEvents, 1000 ) shutdown.doCleanShutdown() self.updateStatusBar(_translate( - "MainWindow", "Stopping notifications... %1%").arg(90)) + "MainWindow", "Stopping notifications... {0}%").format(90)) self.tray.hide() self.updateStatusBar(_translate( - "MainWindow", "Shutdown imminent... %1%").arg(100)) + "MainWindow", "Shutdown imminent... {0}%").format(100)) logger.info("Shutdown complete") self.close() @@ -2982,23 +2982,23 @@ def on_action_InboxReply(self, reply_type=None): ) # toAddressAtCurrentInboxRow = fromAddressAtCurrentInboxRow elif not config.has_section(toAddressAtCurrentInboxRow): - QtGui.QMessageBox.information( + QtWidgets.QMessageBox.information( self, _translate("MainWindow", "Address is gone"), _translate( "MainWindow", - "Bitmessage cannot find your address %1. Perhaps you" + "Bitmessage cannot find your address {0}. Perhaps you" " removed it?" - ).arg(toAddressAtCurrentInboxRow), QtGui.QMessageBox.Ok) + ).format(toAddressAtCurrentInboxRow), QtWidgets.QMessageBox.StandardButton.Ok) elif not config.getboolean( toAddressAtCurrentInboxRow, 'enabled'): - QtGui.QMessageBox.information( + QtWidgets.QMessageBox.information( self, _translate("MainWindow", "Address disabled"), _translate( "MainWindow", "Error: The address from which you are trying to send" " is disabled. You\'ll have to enable it on the" " \'Your Identities\' tab before using it." - ), QtGui.QMessageBox.Ok) + ), QtWidgets.QMessageBox.StandardButton.Ok) else: self.setBroadcastEnablementDependingOnWhetherThisIsAMailingListAddress(toAddressAtCurrentInboxRow) broadcast_tab_index = self.ui.tabWidgetSend.indexOf( @@ -3126,7 +3126,7 @@ def on_action_InboxTrash(self): return currentRow = 0 folder = self.getCurrentFolder() - shifted = QtGui.QApplication.queryKeyboardModifiers() \ + shifted = QtWidgets.QApplication.queryKeyboardModifiers() \ & QtCore.Qt.ShiftModifier tableWidget.setUpdatesEnabled(False) inventoryHashesToTrash = set() @@ -3199,7 +3199,7 @@ def on_action_InboxSaveMessageAs(self): message, = row defaultFilename = "".join(x for x in subjectAtCurrentInboxRow if x.isalnum()) + '.txt' - filename = QtGui.QFileDialog.getSaveFileName( + filename = QtWidgets.QFileDialog.getSaveFileName( self, _translate("MainWindow","Save As..."), defaultFilename, @@ -3220,7 +3220,7 @@ def on_action_SentTrash(self): if not tableWidget: return folder = self.getCurrentFolder() - shifted = QtGui.QApplication.queryKeyboardModifiers() & QtCore.Qt.ShiftModifier + shifted = QtWidgets.QApplication.queryKeyboardModifiers() & QtCore.Qt.ShiftModifier while tableWidget.selectedIndexes() != []: currentRow = tableWidget.selectedIndexes()[0].row() ackdataToTrash = tableWidget.item(currentRow, 3).data() @@ -3256,7 +3256,7 @@ def on_action_SentClipboard(self): currentRow = self.ui.tableWidgetInbox.currentRow() addressAtCurrentRow = self.ui.tableWidgetInbox.item( currentRow, 0).data(QtCore.Qt.UserRole) - clipboard = QtGui.QApplication.clipboard() + clipboard = QtWidgets.QApplication.clipboard() clipboard.setText(str(addressAtCurrentRow)) # Group of functions for the Address Book dialog box @@ -3281,7 +3281,7 @@ def on_action_AddressBookClipboard(self): addresses_string = item.address else: addresses_string += ', ' + item.address - clipboard = QtGui.QApplication.clipboard() + clipboard = QtWidgets.QApplication.clipboard() clipboard.setText(addresses_string) def on_action_AddressBookSend(self): @@ -3323,7 +3323,7 @@ def on_action_AddressBookSubscribe(self): ) def on_context_menuAddressBook(self, point): - self.popMenuAddressBook = QtGui.QMenu(self) + self.popMenuAddressBook = QtWidgets.QMenu(self) self.popMenuAddressBook.addAction(self.actionAddressBookSend) self.popMenuAddressBook.addAction(self.actionAddressBookClipboard) self.popMenuAddressBook.addAction(self.actionAddressBookSubscribe) @@ -3353,7 +3353,7 @@ def on_action_SubscriptionsNew(self): self.click_pushButtonAddSubscription() def on_action_SubscriptionsDelete(self): - if QtGui.QMessageBox.question( + if QtWidgets.QMessageBox.question( self, "Delete subscription?", _translate( "MainWindow", @@ -3364,8 +3364,8 @@ def on_action_SubscriptionsDelete(self): " messages, but you can still view messages you" " already received.\n\nAre you sure you want to" " delete the subscription?" - ), QtGui.QMessageBox.Yes | QtGui.QMessageBox.No - ) != QtGui.QMessageBox.Yes: + ), QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No + ) != QtWidgets.QMessageBox.StandardButton.Yes: return address = self.getCurrentAccount() sqlExecute('''DELETE FROM subscriptions WHERE address=?''', @@ -3377,7 +3377,7 @@ def on_action_SubscriptionsDelete(self): def on_action_SubscriptionsClipboard(self): address = self.getCurrentAccount() - clipboard = QtGui.QApplication.clipboard() + clipboard = QtWidgets.QApplication.clipboard() clipboard.setText(str(address)) def on_action_SubscriptionsEnable(self): @@ -3402,7 +3402,7 @@ def on_action_SubscriptionsDisable(self): def on_context_menuSubscriptions(self, point): currentItem = self.getCurrentItem() - self.popMenuSubscriptions = QtGui.QMenu(self) + self.popMenuSubscriptions = QtWidgets.QMenu(self) if isinstance(currentItem, Ui_AddressWidget): self.popMenuSubscriptions.addAction(self.actionsubscriptionsNew) self.popMenuSubscriptions.addAction(self.actionsubscriptionsDelete) @@ -3588,7 +3588,7 @@ def on_action_YourIdentitiesDelete(self): if account.type == AccountMixin.NORMAL: return # maybe in the future elif account.type == AccountMixin.CHAN: - if QtGui.QMessageBox.question( + if QtWidgets.QMessageBox.question( self, "Delete channel?", _translate( "MainWindow", @@ -3599,8 +3599,8 @@ def on_action_YourIdentitiesDelete(self): " messages, but you can still view messages you" " already received.\n\nAre you sure you want to" " delete the channel?" - ), QtGui.QMessageBox.Yes | QtGui.QMessageBox.No - ) == QtGui.QMessageBox.Yes: + ), QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No + ) == QtWidgets.QMessageBox.StandardButton.Yes: config.remove_section(str(account.address)) else: return @@ -3641,7 +3641,7 @@ def disableIdentity(self, address): def on_action_Clipboard(self): address = self.getCurrentAccount() - clipboard = QtGui.QApplication.clipboard() + clipboard = QtWidgets.QApplication.clipboard() clipboard.setText(str(address)) def on_action_ClipboardMessagelist(self): @@ -3666,7 +3666,7 @@ def on_action_ClipboardMessagelist(self): else: text = tableWidget.item(currentRow, currentColumn).data(QtCore.Qt.UserRole) - clipboard = QtGui.QApplication.clipboard() + clipboard = QtWidgets.QApplication.clipboard() clipboard.setText(text) # set avatar functions @@ -3724,7 +3724,7 @@ def setAvatar(self, addressAtCurrentRow): current_files += [upper] filters[0:0] = ['Image files (' + ' '.join(all_images_filter) + ')'] filters[1:1] = ['All files (*.*)'] - sourcefile = QtGui.QFileDialog.getOpenFileName( + sourcefile = QtWidgets.QFileDialog.getOpenFileName( self, _translate("MainWindow", "Set avatar..."), filter=';;'.join(filters) ) @@ -3736,11 +3736,11 @@ def setAvatar(self, addressAtCurrentRow): if exists | (len(current_files) > 0): displayMsg = _translate( "MainWindow", "Do you really want to remove this avatar?") - overwrite = QtGui.QMessageBox.question( + overwrite = QtWidgets.QMessageBox.question( self, 'Message', displayMsg, - QtGui.QMessageBox.Yes, QtGui.QMessageBox.No) + QtWidgets.QMessageBox.StandardButton.Yes, QtWidgets.QMessageBox.StandardButton.No) else: - overwrite = QtGui.QMessageBox.No + overwrite = QtWidgets.QMessageBox.StandardButton.No else: # ask whether to overwrite old avatar if exists | (len(current_files) > 0): @@ -3748,15 +3748,15 @@ def setAvatar(self, addressAtCurrentRow): "MainWindow", "You have already set an avatar for this address." " Do you really want to overwrite it?") - overwrite = QtGui.QMessageBox.question( + overwrite = QtWidgets.QMessageBox.question( self, 'Message', displayMsg, - QtGui.QMessageBox.Yes, QtGui.QMessageBox.No) + QtWidgets.QMessageBox.StandardButton.Yes, QtWidgets.QMessageBox.StandardButton.No) else: - overwrite = QtGui.QMessageBox.No + overwrite = QtWidgets.QMessageBox.StandardButton.No # copy the image file to the appdata folder - if (not exists) | (overwrite == QtGui.QMessageBox.Yes): - if overwrite == QtGui.QMessageBox.Yes: + if (not exists) | (overwrite == QtWidgets.QMessageBox.StandardButton.Yes): + if overwrite == QtWidgets.QMessageBox.StandardButton.Yes: for file in current_files: QtCore.QFile.remove(file) QtCore.QFile.remove(destination) @@ -3788,7 +3788,7 @@ def setAddressSound(self, addr): "MainWindow", "Sound files (%s)" % ' '.join(['*%s%s' % (os.extsep, ext) for ext in sound.extensions]) ))] - sourcefile = str(QtGui.QFileDialog.getOpenFileName( + sourcefile = str(QtWidgets.QFileDialog.getOpenFileName( self, _translate("MainWindow", "Set notification sound..."), filter=';;'.join(filters) )) @@ -3806,15 +3806,15 @@ def setAddressSound(self, addr): pattern = destfile.lower() for item in os.listdir(destdir): if item.lower() == pattern: - overwrite = QtGui.QMessageBox.question( + overwrite = QtWidgets.QMessageBox.question( self, _translate("MainWindow", "Message"), _translate( "MainWindow", "You have already set a notification sound" " for this address book entry." " Do you really want to overwrite it?"), - QtGui.QMessageBox.Yes, QtGui.QMessageBox.No - ) == QtGui.QMessageBox.Yes + QtWidgets.QMessageBox.StandardButton.Yes, QtWidgets.QMessageBox.StandardButton.No + ) == QtWidgets.QMessageBox.StandardButton.Yes if overwrite: QtCore.QFile.remove(os.path.join(destdir, item)) break @@ -3825,7 +3825,7 @@ def setAddressSound(self, addr): def on_context_menuYourIdentities(self, point): currentItem = self.getCurrentItem() - self.popMenuYourIdentities = QtGui.QMenu(self) + self.popMenuYourIdentities = QtWidgets.QMenu(self) if isinstance(currentItem, Ui_AddressWidget): self.popMenuYourIdentities.addAction(self.actionNewYourIdentities) self.popMenuYourIdentities.addSeparator() @@ -3855,7 +3855,7 @@ def on_context_menuYourIdentities(self, point): # TODO make one popMenu def on_context_menuChan(self, point): currentItem = self.getCurrentItem() - self.popMenu = QtGui.QMenu(self) + self.popMenu = QtWidgets.QMenu(self) if isinstance(currentItem, Ui_AddressWidget): self.popMenu.addAction(self.actionNew) self.popMenu.addAction(self.actionDelete) @@ -3891,7 +3891,7 @@ def on_context_menuInbox(self, point): self.on_context_menuSent(point) return - self.popMenuInbox = QtGui.QMenu(self) + self.popMenuInbox = QtWidgets.QMenu(self) self.popMenuInbox.addAction(self.actionForceHtml) self.popMenuInbox.addAction(self.actionMarkUnread) self.popMenuInbox.addSeparator() @@ -3926,7 +3926,7 @@ def on_context_menuInbox(self, point): def on_context_menuSent(self, point): currentRow = self.ui.tableWidgetInbox.currentRow() - self.popMenuSent = QtGui.QMenu(self) + self.popMenuSent = QtWidgets.QMenu(self) self.popMenuSent.addAction(self.actionSentClipboard) self._contact_selected = self.ui.tableWidgetInbox.item(currentRow, 0) # preloaded gui.menu plugins with prefix 'address' diff --git a/src/bitmessageqt/bitmessageui.py b/src/bitmessageqt/bitmessageui.py index f85831eb26..1e882928dc 100644 --- a/src/bitmessageqt/bitmessageui.py +++ b/src/bitmessageqt/bitmessageui.py @@ -9,10 +9,13 @@ from PyQt6 import QtCore, QtGui, QtWidgets from bmconfigparser import config from .foldertree import AddressBookCompleter +from .blacklist import Blacklist +from .networkstatus import NetworkStatus class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") + MainWindow.resize(885, 580) self.MainDock = QtWidgets.QDockWidget(parent=MainWindow) self.MainDock.setGeometry(QtCore.QRect(0, 0, 885, 580)) icon = QtGui.QIcon() @@ -434,8 +437,14 @@ def setupUi(self, MainWindow): icon8 = QtGui.QIcon() icon8.addPixmap(QtGui.QPixmap(":/newPrefix/images/can-icon-16px.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) self.tabWidget.addTab(self.tab_3, icon8, "") - self.blackwhitelist = QtWidgets.QWidget() + self.blackwhitelist = Blacklist() self.blackwhitelist.setObjectName("blackwhitelist") + self.tabWidget.addTab(self.blackwhitelist, QtGui.QIcon(":/newPrefix/images/blacklist.png"), "") + # Initialize the Blacklist or Whitelist + if config.get('bitmessagesettings', 'blackwhitelist') == 'white': + self.blackwhitelist.radioButtonWhitelist.click() + self.blackwhitelist.rerenderBlackWhiteList() + self.gridLayout_6 = QtWidgets.QGridLayout(self.blackwhitelist) self.gridLayout_6.setObjectName("gridLayout_6") self.radioButtonBlacklist = QtWidgets.QRadioButton(parent=self.blackwhitelist) @@ -471,7 +480,8 @@ def setupUi(self, MainWindow): icon9 = QtGui.QIcon() icon9.addPixmap(QtGui.QPixmap(":/newPrefix/images/blacklist.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) self.tabWidget.addTab(self.blackwhitelist, icon9, "") - self.networkstatus = QtWidgets.QWidget() + self.networkstatus = NetworkStatus() + self.tabWidget.addTab(self.networkstatus, QtGui.QIcon(":/newPrefix/images/networkstatus.png"), "") self.networkstatus.setObjectName("networkstatus") self.pushButtonStatusIcon = QtWidgets.QPushButton(parent=self.networkstatus) self.pushButtonStatusIcon.setGeometry(QtCore.QRect(680, 440, 21, 23)) @@ -539,8 +549,7 @@ def setupUi(self, MainWindow): self.tabWidget.addTab(self.networkstatus, icon11, "") self.gridLayout_10.addWidget(self.tabWidget, 0, 0, 1, 1) self.MainDock.setWidget(self.centralwidget) - # XXX unresolved - #MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(None), self.MainDock) + MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea.AllDockWidgetAreas, self.MainDock) self.menubar = QtWidgets.QMenuBar(parent=MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 885, 27)) self.menubar.setObjectName("menubar") @@ -637,6 +646,7 @@ def setupUi(self, MainWindow): self.subscriptionsContextMenuToolbar = QtWidgets.QToolBar() def updateNetworkSwitchMenuLabel(self, dontconnect=None): + _translate = QtCore.QCoreApplication.translate if dontconnect is None: _translate = QtCore.QCoreApplication.translate dontconnect = config.safeGetBoolean( @@ -741,7 +751,10 @@ def retranslateUi(self, MainWindow): item.setText(_translate("MainWindow", "Name or Label")) item = self.tableWidgetBlacklist.horizontalHeaderItem(1) item.setText(_translate("MainWindow", "Address")) + self.blackwhitelist.retranslateUi() self.tabWidget.setTabText(self.tabWidget.indexOf(self.blackwhitelist), _translate("MainWindow", "Blacklist")) + self.networkstatus.retranslateUi() + self.tabWidget.setTabText(self.tabWidget.indexOf(self.networkstatus), _translate("MainWindow", "Network Status")) item = self.tableWidgetConnectionCount.horizontalHeaderItem(0) item.setText(_translate("MainWindow", "Stream #")) item = self.tableWidgetConnectionCount.horizontalHeaderItem(1) diff --git a/src/bitmessageqt/bitmessageui.diff b/src/bitmessageqt/bitmessageui.py.diff similarity index 65% rename from src/bitmessageqt/bitmessageui.diff rename to src/bitmessageqt/bitmessageui.py.diff index 7e42fa3ef9..989e82251d 100644 --- a/src/bitmessageqt/bitmessageui.diff +++ b/src/bitmessageqt/bitmessageui.py.diff @@ -1,16 +1,18 @@ ---- bitmessageui.py.orig 2024-05-12 18:57:04.429581050 +0900 -+++ bitmessageui.py 2024-05-12 19:50:49.951776910 +0900 -@@ -7,7 +7,8 @@ +--- bitmessageui.py.orig 2024-05-13 08:32:22.376971328 +0900 ++++ bitmessageui.py 2024-05-13 09:48:39.354481762 +0900 +@@ -7,7 +7,10 @@ from PyQt6 import QtCore, QtGui, QtWidgets - +from bmconfigparser import config +from .foldertree import AddressBookCompleter ++from .blacklist import Blacklist ++from .networkstatus import NetworkStatus class Ui_MainWindow(object): def setupUi(self, MainWindow): -@@ -137,6 +138,11 @@ +@@ -140,6 +143,11 @@ self.tableWidgetAddressBook.horizontalHeader().setStretchLastSection(True) self.tableWidgetAddressBook.verticalHeader().setVisible(False) self.verticalLayout_2.addWidget(self.tableWidgetAddressBook) @@ -22,7 +24,7 @@ self.pushButtonAddAddressBook = QtWidgets.QPushButton(parent=self.send) self.pushButtonAddAddressBook.setMaximumSize(QtCore.QSize(200, 16777215)) self.pushButtonAddAddressBook.setObjectName("pushButtonAddAddressBook") -@@ -181,6 +187,7 @@ +@@ -184,6 +192,7 @@ self.lineEditTo = QtWidgets.QLineEdit(parent=self.tab) self.lineEditTo.setObjectName("lineEditTo") self.gridLayout_2.addWidget(self.lineEditTo, 1, 1, 1, 1) @@ -30,7 +32,7 @@ self.verticalLayout_5.addLayout(self.gridLayout_2) self.textEditMessage = QtWidgets.QTextEdit(parent=self.tab) self.textEditMessage.setObjectName("textEditMessage") -@@ -260,6 +267,9 @@ +@@ -263,6 +272,9 @@ self.labelHumanFriendlyTTLDescription.setMaximumSize(QtCore.QSize(45, 16777215)) self.labelHumanFriendlyTTLDescription.setObjectName("labelHumanFriendlyTTLDescription") self.horizontalLayout_5.addWidget(self.labelHumanFriendlyTTLDescription) @@ -40,7 +42,42 @@ self.pushButtonSend = QtWidgets.QPushButton(parent=self.send) self.pushButtonSend.setMaximumSize(QtCore.QSize(16777215, 16777215)) self.pushButtonSend.setObjectName("pushButtonSend") -@@ -546,6 +556,8 @@ +@@ -425,8 +437,14 @@ + icon8 = QtGui.QIcon() + icon8.addPixmap(QtGui.QPixmap(":/newPrefix/images/can-icon-16px.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.tabWidget.addTab(self.tab_3, icon8, "") +- self.blackwhitelist = QtWidgets.QWidget() ++ self.blackwhitelist = Blacklist() + self.blackwhitelist.setObjectName("blackwhitelist") ++ self.tabWidget.addTab(self.blackwhitelist, QtGui.QIcon(":/newPrefix/images/blacklist.png"), "") ++ # Initialize the Blacklist or Whitelist ++ if config.get('bitmessagesettings', 'blackwhitelist') == 'white': ++ self.blackwhitelist.radioButtonWhitelist.click() ++ self.blackwhitelist.rerenderBlackWhiteList() ++ + self.gridLayout_6 = QtWidgets.QGridLayout(self.blackwhitelist) + self.gridLayout_6.setObjectName("gridLayout_6") + self.radioButtonBlacklist = QtWidgets.QRadioButton(parent=self.blackwhitelist) +@@ -462,7 +480,8 @@ + icon9 = QtGui.QIcon() + icon9.addPixmap(QtGui.QPixmap(":/newPrefix/images/blacklist.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.tabWidget.addTab(self.blackwhitelist, icon9, "") +- self.networkstatus = QtWidgets.QWidget() ++ self.networkstatus = NetworkStatus() ++ self.tabWidget.addTab(self.networkstatus, QtGui.QIcon(":/newPrefix/images/networkstatus.png"), "") + self.networkstatus.setObjectName("networkstatus") + self.pushButtonStatusIcon = QtWidgets.QPushButton(parent=self.networkstatus) + self.pushButtonStatusIcon.setGeometry(QtCore.QRect(680, 440, 21, 23)) +@@ -530,7 +549,7 @@ + self.tabWidget.addTab(self.networkstatus, icon11, "") + self.gridLayout_10.addWidget(self.tabWidget, 0, 0, 1, 1) + self.MainDock.setWidget(self.centralwidget) +- MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(None), self.MainDock) ++ MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea.AllDockWidgetAreas, self.MainDock) + self.menubar = QtWidgets.QMenuBar(parent=MainWindow) + self.menubar.setGeometry(QtCore.QRect(0, 0, 885, 27)) + self.menubar.setObjectName("menubar") +@@ -550,6 +569,8 @@ self.actionManageKeys = QtGui.QAction(parent=MainWindow) self.actionManageKeys.setCheckable(False) self.actionManageKeys.setEnabled(True) @@ -49,7 +86,7 @@ icon = QtGui.QIcon.fromTheme("dialog-password") self.actionManageKeys.setIcon(icon) self.actionManageKeys.setObjectName("actionManageKeys") -@@ -557,6 +569,10 @@ +@@ -561,6 +582,10 @@ icon = QtGui.QIcon.fromTheme("help-contents") self.actionHelp.setIcon(icon) self.actionHelp.setObjectName("actionHelp") @@ -60,7 +97,7 @@ self.actionAbout = QtGui.QAction(parent=MainWindow) icon = QtGui.QIcon.fromTheme("help-about") self.actionAbout.setIcon(icon) -@@ -580,9 +596,11 @@ +@@ -584,9 +609,11 @@ self.menuFile.addAction(self.actionManageKeys) self.menuFile.addAction(self.actionDeleteAllTrashedMessages) self.menuFile.addAction(self.actionRegenerateDeterministicAddresses) @@ -72,7 +109,7 @@ self.menuHelp.addAction(self.actionAbout) self.menubar.addAction(self.menuFile.menuAction()) self.menubar.addAction(self.menuSettings.menuAction()) -@@ -606,6 +624,25 @@ +@@ -610,6 +637,26 @@ MainWindow.setTabOrder(self.tableWidgetBlacklist, self.tableWidgetConnectionCount) MainWindow.setTabOrder(self.tableWidgetConnectionCount, self.pushButtonStatusIcon) @@ -85,6 +122,7 @@ + self.subscriptionsContextMenuToolbar = QtWidgets.QToolBar() + + def updateNetworkSwitchMenuLabel(self, dontconnect=None): ++ _translate = QtCore.QCoreApplication.translate + if dontconnect is None: + _translate = QtCore.QCoreApplication.translate + dontconnect = config.safeGetBoolean( @@ -97,8 +135,8 @@ + def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate - MainWindow.setWindowTitle(_translate("MainWindow", "Bitmessage")) -@@ -653,6 +690,7 @@ + self.MainDock.setWindowTitle(_translate("MainWindow", "Bitmessage")) +@@ -657,6 +704,7 @@ self.tabWidgetSend.setTabText(self.tabWidgetSend.indexOf(self.tab_2), _translate("MainWindow", "Send Message to your Subscribers")) self.pushButtonTTL.setText(_translate("MainWindow", "TTL:")) self.labelHumanFriendlyTTLDescription.setText(_translate("MainWindow", "X days")) @@ -106,7 +144,18 @@ self.pushButtonSend.setText(_translate("MainWindow", "Send")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.send), _translate("MainWindow", "Send")) self.treeWidgetSubscriptions.headerItem().setText(0, _translate("MainWindow", "Subscriptions")) -@@ -722,8 +760,10 @@ +@@ -703,7 +751,10 @@ + item.setText(_translate("MainWindow", "Name or Label")) + item = self.tableWidgetBlacklist.horizontalHeaderItem(1) + item.setText(_translate("MainWindow", "Address")) ++ self.blackwhitelist.retranslateUi() + self.tabWidget.setTabText(self.tabWidget.indexOf(self.blackwhitelist), _translate("MainWindow", "Blacklist")) ++ self.networkstatus.retranslateUi() ++ self.tabWidget.setTabText(self.tabWidget.indexOf(self.networkstatus), _translate("MainWindow", "Network Status")) + item = self.tableWidgetConnectionCount.horizontalHeaderItem(0) + item.setText(_translate("MainWindow", "Stream #")) + item = self.tableWidgetConnectionCount.horizontalHeaderItem(1) +@@ -726,8 +777,10 @@ self.actionExit.setShortcut(_translate("MainWindow", "Ctrl+Q")) self.actionHelp.setText(_translate("MainWindow", "Help")) self.actionHelp.setShortcut(_translate("MainWindow", "F1")) diff --git a/src/bitmessageqt/bitmessageui.py.orig b/src/bitmessageqt/bitmessageui.py.orig index f6c1de6256..2b910eec8c 100644 --- a/src/bitmessageqt/bitmessageui.py.orig +++ b/src/bitmessageqt/bitmessageui.py.orig @@ -12,6 +12,7 @@ from PyQt6 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") + MainWindow.resize(885, 580) self.MainDock = QtWidgets.QDockWidget(parent=MainWindow) self.MainDock.setGeometry(QtCore.QRect(0, 0, 885, 580)) icon = QtGui.QIcon() diff --git a/src/bitmessageqt/bitmessageui.ui b/src/bitmessageqt/bitmessageui.ui index 16a4670bac..80f1dc2326 100644 --- a/src/bitmessageqt/bitmessageui.ui +++ b/src/bitmessageqt/bitmessageui.ui @@ -2,6 +2,14 @@ MainWindow + + + 0 + 0 + 885 + 580 + + diff --git a/src/bitmessageqt/foldertree.py b/src/bitmessageqt/foldertree.py index 4dfb8bb968..922854d417 100644 --- a/src/bitmessageqt/foldertree.py +++ b/src/bitmessageqt/foldertree.py @@ -51,13 +51,13 @@ def folderColor(self): def accountBrush(self): """Account brush (for QT UI)""" brush = QtGui.QBrush(self.accountColor()) - brush.setStyle(QtCore.Qt.NoBrush) + brush.setStyle(QtCore.Qt.BrushStyle.NoBrush) return brush def folderBrush(self): """Folder brush (for QT UI)""" brush = QtGui.QBrush(self.folderColor()) - brush.setStyle(QtCore.Qt.NoBrush) + brush.setStyle(QtCore.Qt.BrushStyle.NoBrush) return brush def accountString(self): @@ -124,7 +124,7 @@ def defaultLabel(self): AccountMixin.NORMAL, AccountMixin.CHAN, AccountMixin.MAILINGLIST): try: - retval = unicode( + retval = str( config.get(self.address, 'label'), 'utf-8') except Exception: queryreturn = sqlQuery( @@ -136,12 +136,12 @@ def defaultLabel(self): if queryreturn != []: for row in queryreturn: retval, = row - retval = unicode(retval, 'utf-8') + retval = str(retval, 'utf-8') elif self.address is None or self.type == AccountMixin.ALL: - return unicode( + return str( str(_translate("MainWindow", "All accounts")), 'utf-8') - return retval or unicode(self.address, 'utf-8') + return retval or str(self.address, 'utf-8') class BMTreeWidgetItem(QtWidgets.QTreeWidgetItem, AccountMixin): @@ -210,7 +210,7 @@ def __lt__(self, other): y = self.folderWeight[other.folderName] else: y = 99 - reverse = QtCore.Qt.DescendingOrder == \ + reverse = QtCore.Qt.SortOrder.DescendingOrder == \ self.treeWidget().header().sortIndicatorOrder() if x == y: return self.folderName < other.folderName @@ -232,15 +232,15 @@ def _setup(self, parent, pos): def _getLabel(self): if self.address is None: - return unicode(_translate( - "MainWindow", "All accounts").toUtf8(), 'utf-8', 'ignore') + return _translate( + "MainWindow", "All accounts") else: try: - return unicode( + return str( config.get(self.address, 'label'), 'utf-8', 'ignore') except: - return unicode(self.address, 'utf-8') + return str(self.address, 'utf-8') def _getAddressBracket(self, unreadCount=False): ret = "" if self.isExpanded() \ @@ -284,7 +284,7 @@ def _getSortRank(self): def __lt__(self, other): # pylint: disable=protected-access if isinstance(other, Ui_AddressWidget): - reverse = QtCore.Qt.DescendingOrder == \ + reverse = QtCore.Qt.SortOrder.DescendingOrder == \ self.treeWidget().header().sortIndicatorOrder() if self._getSortRank() == other._getSortRank(): x = self._getLabel().lower() @@ -311,8 +311,8 @@ def _getLabel(self): if queryreturn != []: for row in queryreturn: retval, = row - return unicode(retval, 'utf-8', 'ignore') - return unicode(self.address, 'utf-8') + return str(retval, 'utf-8', 'ignore') + return str(self.address, 'utf-8') def setType(self): """Set account type""" @@ -326,7 +326,7 @@ def setData(self, column, role, value): label = str( value.toString().toUtf8()).decode('utf-8', 'ignore') else: - label = unicode(value, 'utf-8', 'ignore') + label = str(value, 'utf-8', 'ignore') sqlExecute( '''UPDATE subscriptions SET label=? WHERE address=?''', label, self.address) @@ -407,7 +407,7 @@ def setLabel(self, label=None): AccountMixin.NORMAL, AccountMixin.CHAN, AccountMixin.MAILINGLIST): try: - newLabel = unicode( + newLabel = str( config.get(self.address, 'label'), 'utf-8', 'ignore') except: @@ -418,7 +418,7 @@ def setLabel(self, label=None): '''select label from subscriptions where address=?''', self.address) if queryreturn: for row in queryreturn: - newLabel = unicode(row[0], 'utf-8', 'ignore') + newLabel = str(row[0], 'utf-8', 'ignore') self.label = newLabel @@ -456,7 +456,7 @@ def data(self, role): if role == QtCore.Qt.ItemDataRole.UserRole: return self.subject if role == QtCore.Qt.ItemDataRole.ToolTipRole: - return escape(unicode(self.subject, 'utf-8')) + return escape(str(self.subject, 'utf-8')) return super(MessageList_SubjectWidget, self).data(role) # label (or address) alphabetically, disabled at the end @@ -534,7 +534,7 @@ def setData(self, role, value): def __lt__(self, other): if isinstance(other, Ui_AddressBookWidgetItem): - reverse = QtCore.Qt.DescendingOrder == \ + reverse = QtCore.Qt.SortOrder.DescendingOrder == \ self.tableWidget().horizontalHeader().sortIndicatorOrder() if self.type == other.type: @@ -584,14 +584,14 @@ def onCursorPositionChanged(self, oldPos, newPos): # pylint: disable=unused-arg def splitPath(self, path): """Split on semicolon""" - text = unicode(path.toUtf8(), 'utf-8') + text = str(path.toUtf8(), 'utf-8') return [text[:self.widget().cursorPosition()].split(';')[-1].strip()] def pathFromIndex(self, index): """Perform autocompletion (reimplemented QCompleter method)""" - autoString = unicode( + autoString = str( index.data(QtCore.Qt.ItemDataRole.EditRole).toString().toUtf8(), 'utf-8') - text = unicode(self.widget().text().toUtf8(), 'utf-8') + text = str(self.widget().text().toUtf8(), 'utf-8') # If cursor position was saved, restore it, else save it if self.cursorPos != -1: diff --git a/src/bitmessageqt/networkstatus.py b/src/bitmessageqt/networkstatus.py index 0d2dda1902..4a7b2ee640 100644 --- a/src/bitmessageqt/networkstatus.py +++ b/src/bitmessageqt/networkstatus.py @@ -125,12 +125,12 @@ def updateNumberOfBytes(self): self.labelBytesRecvCount.setText( _translate( "networkstatus", - "Down: %1/s Total: %2").arg( + "Down: {0}/s Total: {1}").format( self.formatByteRate(network.stats.downloadSpeed()), self.formatBytes(network.stats.receivedBytes()))) self.labelBytesSentCount.setText( _translate( - "networkstatus", "Up: %1/s Total: %2").arg( + "networkstatus", "Up: {0}/s Total: {1}").format( self.formatByteRate(network.stats.uploadSpeed()), self.formatBytes(network.stats.sentBytes()))) @@ -160,19 +160,19 @@ def updateNetworkStatusTab(self, outbound, add, destination): self.tableWidgetConnectionCount.insertRow(0) self.tableWidgetConnectionCount.setItem( 0, 0, - QtGui.QTableWidgetItem("%s:%i" % (destination.host, destination.port)) + QtWidgets.QTableWidgetItem("%s:%i" % (destination.host, destination.port)) ) self.tableWidgetConnectionCount.setItem( 0, 2, - QtGui.QTableWidgetItem("%s" % (c.userAgent)) + QtWidgets.QTableWidgetItem("%s" % (c.userAgent)) ) self.tableWidgetConnectionCount.setItem( 0, 3, - QtGui.QTableWidgetItem("%s" % (c.tlsVersion)) + QtWidgets.QTableWidgetItem("%s" % (c.tlsVersion)) ) self.tableWidgetConnectionCount.setItem( 0, 4, - QtGui.QTableWidgetItem("%s" % (",".join(map(str, c.streams)))) + QtWidgets.QTableWidgetItem("%s" % (",".join(map(str, c.streams)))) ) try: # .. todo:: FIXME: hard coded stream no @@ -181,23 +181,23 @@ def updateNetworkStatusTab(self, outbound, add, destination): rating = "-" self.tableWidgetConnectionCount.setItem( 0, 1, - QtGui.QTableWidgetItem("%s" % (rating)) + QtWidgets.QTableWidgetItem("%s" % (rating)) ) if outbound: - brush = QtGui.QBrush(QtGui.QColor("yellow"), QtCore.Qt.SolidPattern) + brush = QtGui.QBrush(QtGui.QColor("yellow"), QtCore.Qt.BrushStyle.SolidPattern) else: - brush = QtGui.QBrush(QtGui.QColor("green"), QtCore.Qt.SolidPattern) + brush = QtGui.QBrush(QtGui.QColor("green"), QtCore.Qt.BrushStyle.SolidPattern) for j in range(1): self.tableWidgetConnectionCount.item(0, j).setBackground(brush) - self.tableWidgetConnectionCount.item(0, 0).setData(QtCore.Qt.UserRole, destination) - self.tableWidgetConnectionCount.item(0, 1).setData(QtCore.Qt.UserRole, outbound) + self.tableWidgetConnectionCount.item(0, 0).setData(QtCore.Qt.ItemDataRole.UserRole, destination) + self.tableWidgetConnectionCount.item(0, 1).setData(QtCore.Qt.ItemDataRole.UserRole, outbound) else: if not connectionpool.pool.inboundConnections: self.window().setStatusIcon('yellow') for i in range(self.tableWidgetConnectionCount.rowCount()): - if self.tableWidgetConnectionCount.item(i, 0).data(QtCore.Qt.UserRole).toPyObject() != destination: + if self.tableWidgetConnectionCount.item(i, 0).data(QtCore.Qt.ItemDataRole.UserRole).toPyObject() != destination: continue - if self.tableWidgetConnectionCount.item(i, 1).data(QtCore.Qt.UserRole).toPyObject() == outbound: + if self.tableWidgetConnectionCount.item(i, 1).data(QtCore.Qt.ItemDataRole.UserRole).toPyObject() == outbound: self.tableWidgetConnectionCount.removeRow(i) break @@ -205,7 +205,7 @@ def updateNetworkStatusTab(self, outbound, add, destination): self.tableWidgetConnectionCount.setSortingEnabled(True) self.labelTotalConnections.setText( _translate( - "networkstatus", "Total Connections: %1").arg( + "networkstatus", "Total Connections: {0}").format( str(self.tableWidgetConnectionCount.rowCount()))) # FYI: The 'singlelistener' thread sets the icon color to green when it # receives an incoming connection, meaning that the user's firewall is @@ -218,7 +218,7 @@ def updateNetworkStatusTab(self, outbound, add, destination): # timer driven def runEveryTwoSeconds(self): """Updates counters, runs every 2 seconds if the timer is running""" - self.labelLookupsPerSecond.setText(_translate("networkstatus", "Inventory lookups per second: %1").arg( + self.labelLookupsPerSecond.setText(_translate("networkstatus", "Inventory lookups per second: {0}").format( str(state.Inventory.numberOfInventoryLookupsPerformed / 2))) state.Inventory.numberOfInventoryLookupsPerformed = 0 self.updateNumberOfBytes() @@ -229,11 +229,11 @@ def retranslateUi(self): super(NetworkStatus, self).retranslateUi() self.labelTotalConnections.setText( _translate( - "networkstatus", "Total Connections: %1").arg( + "networkstatus", "Total Connections: {0}").format( str(self.tableWidgetConnectionCount.rowCount()))) self.labelStartupTime.setText(_translate( - "networkstatus", "Since startup on %1" - ).arg(l10n.formatTimestamp(self.startup))) + "networkstatus", "Since startup on {0}" + ).format(l10n.formatTimestamp(self.startup))) self.updateNumberOfMessagesProcessed() self.updateNumberOfBroadcastsProcessed() self.updateNumberOfPubkeysProcessed() diff --git a/src/bitmessageqt/retranslateui.py b/src/bitmessageqt/retranslateui.py index 31fc490e42..17dee2c705 100644 --- a/src/bitmessageqt/retranslateui.py +++ b/src/bitmessageqt/retranslateui.py @@ -1,17 +1,17 @@ from os import path -from PyQt6 import QtGui +from PyQt6 import QtGui, QtWidgets from debug import logger -import bitmessageqt.widgets +import bitmessageqt.widgets as widgets class RetranslateMixin(object): def retranslateUi(self): - defaults = QtGui.QWidget() + defaults = QtWidgets.QWidget() widgets.load(self.__class__.__name__.lower() + '.ui', defaults) - for attr, value in defaults.__dict__.iteritems(): + for attr, value in defaults.__dict__.items(): setTextMethod = getattr(value, "setText", None) if callable(setTextMethod): getattr(self, attr).setText(getattr(defaults, attr).text()) - elif isinstance(value, QtGui.QTableWidget): + elif isinstance(value, QtWidgets.QTableWidget): for i in range (value.columnCount()): getattr(self, attr).horizontalHeaderItem(i).setText( getattr(defaults, attr).horizontalHeaderItem(i).text()) diff --git a/src/bitmessageqt/settings.py b/src/bitmessageqt/settings.py index b95ee764fa..5546f8087f 100644 --- a/src/bitmessageqt/settings.py +++ b/src/bitmessageqt/settings.py @@ -163,7 +163,7 @@ def adjust_from_config(self, config): self.comboBoxProxyTypeChanged(self.comboBoxProxyType.currentIndex()) if self._proxy_type: - for node, info in six.iteritems( + for node, info in six.items( knownnodes.knownNodes.get( min(state.streamsInWhichIAmParticipating), []) ): diff --git a/src/bitmessageqt/uisignaler.py b/src/bitmessageqt/uisignaler.py index df30cf1f95..0a4b27ced0 100644 --- a/src/bitmessageqt/uisignaler.py +++ b/src/bitmessageqt/uisignaler.py @@ -43,69 +43,51 @@ def run(self): command, data = queues.UISignalQueue.get() if command == 'writeNewAddressToTable': label, address, streamNumber = data - self.emit( - SIGNAL("writeNewAddressToTable(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject)"), - label, - address, - str(streamNumber)) + self.writeNewAddressToTable.emit(label, address, str(streamNumber)) elif command == 'updateStatusBar': self.updateStatusBar.emit(data) elif command == 'updateSentItemStatusByToAddress': toAddress, message = data - self.emit(SIGNAL( - "updateSentItemStatusByToAddress(PyQt_PyObject,PyQt_PyObject)"), toAddress, message) + self.updateSentItemStatusByToAddress.emit(toAddress, message) elif command == 'updateSentItemStatusByAckdata': ackData, message = data - self.emit(SIGNAL( - "updateSentItemStatusByAckdata(PyQt_PyObject,PyQt_PyObject)"), ackData, message) + self.updateSentItemStatusByAckdata.emit(ackData, message) elif command == 'displayNewInboxMessage': inventoryHash, toAddress, fromAddress, subject, body = data - self.emit(SIGNAL( - "displayNewInboxMessage(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject)"), - inventoryHash, toAddress, fromAddress, subject, body) + self.displayNewInboxMessage.emit(inventoryHash, toAddress, fromAddress, subject, body) elif command == 'displayNewSentMessage': toAddress, fromLabel, fromAddress, subject, message, ackdata = data - self.emit(SIGNAL( - "displayNewSentMessage(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject,PyQt_PyObject)"), - toAddress, fromLabel, fromAddress, subject, message, ackdata) + self.displayNewSentMessage.emit(toAddress, fromLabel, fromAddress, subject, message, ackdata) elif command == 'updateNetworkStatusTab': outbound, add, destination = data - self.emit( - SIGNAL("updateNetworkStatusTab(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject)"), - outbound, - add, - destination) + self.updateNetworkStatusTab.emit(outbound, add, destination) elif command == 'updateNumberOfMessagesProcessed': - self.emit(SIGNAL("updateNumberOfMessagesProcessed()")) + self.updateNumberOfMessagesProcessed.emit() elif command == 'updateNumberOfPubkeysProcessed': - self.emit(SIGNAL("updateNumberOfPubkeysProcessed()")) + self.updateNumberOfPubkeysProcessed.emit() elif command == 'updateNumberOfBroadcastsProcessed': - self.emit(SIGNAL("updateNumberOfBroadcastsProcessed()")) + self.updateNumberOfBroadcastsProcessed.emit() elif command == 'setStatusIcon': - self.emit(SIGNAL("setStatusIcon(PyQt_PyObject)"), data) + self.setStatusIcon.emit(data) elif command == 'changedInboxUnread': - self.emit(SIGNAL("changedInboxUnread(PyQt_PyObject)"), data) + self.changedInboxUnread.emit(data) elif command == 'rerenderMessagelistFromLabels': - self.emit(SIGNAL("rerenderMessagelistFromLabels()")) + self.rerenderMessagelistFromLabels.emit() elif command == 'rerenderMessagelistToLabels': - self.emit(SIGNAL("rerenderMessagelistToLabels()")) + self.rerenderMessagelistToLabels.emit() elif command == 'rerenderAddressBook': - self.emit(SIGNAL("rerenderAddressBook()")) + self.rerenderAddressBook.emit() elif command == 'rerenderSubscriptions': - self.emit(SIGNAL("rerenderSubscriptions()")) + self.rerenderSubscriptions.emit() elif command == 'rerenderBlackWhiteList': - self.emit(SIGNAL("rerenderBlackWhiteList()")) + self.rerenderBlackWhiteList.emit() elif command == 'removeInboxRowByMsgid': - self.emit(SIGNAL("removeInboxRowByMsgid(PyQt_PyObject)"), data) + self.removeInboxRowByMsgid.emit(data) elif command == 'newVersionAvailable': - self.emit(SIGNAL("newVersionAvailable(PyQt_PyObject)"), data) + self.newVersionAvailable.emit(data) elif command == 'alert': title, text, exitAfterUserClicksOk = data - self.emit( - SIGNAL("displayAlert(PyQt_PyObject, PyQt_PyObject, PyQt_PyObject)"), - title, - text, - exitAfterUserClicksOk) + self.displayAlert.emit(title, text, exitAfterUserClicksOk) else: sys.stderr.write( 'Command sent to UISignaler not recognized: %s\n' % command) diff --git a/src/bitmessageqt/utils.py b/src/bitmessageqt/utils.py index 3a5b91865c..4a5b5ee637 100644 --- a/src/bitmessageqt/utils.py +++ b/src/bitmessageqt/utils.py @@ -38,7 +38,7 @@ def identiconize(address): # stripped from PIL and uses QT instead (by sendiulo, same license) import qidenticon icon_hash = hashlib.md5( - addBMIfNotPresent(address) + identiconsuffix).hexdigest() + (addBMIfNotPresent(address) + identiconsuffix).encode()).hexdigest() use_two_colors = identicon_lib[:len('qidenticon_two')] == 'qidenticon_two' opacity = int( identicon_lib not in ( @@ -51,7 +51,7 @@ def identiconize(address): # filename = './images/identicons/'+hash+'.png' # image.save(filename) idcon = QtGui.QIcon() - idcon.addPixmap(image, QtGui.QIcon.Normal, QtGui.QIcon.Off) + idcon.addPixmap(image, QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) return idcon elif identicon_lib == 'pydenticon': # Here you could load pydenticon.py @@ -81,7 +81,7 @@ def avatarize(address): falls back to identiconize(address) """ idcon = QtGui.QIcon() - icon_hash = hashlib.md5(addBMIfNotPresent(address)).hexdigest() + icon_hash = hashlib.md5(addBMIfNotPresent(address).encode()).hexdigest() if address == str_broadcast_subscribers: # don't hash [Broadcast subscribers] icon_hash = address diff --git a/src/class_singleWorker.py b/src/class_singleWorker.py index f2821f6570..e7537f6b2d 100644 --- a/src/class_singleWorker.py +++ b/src/class_singleWorker.py @@ -1511,4 +1511,4 @@ def generateFullAckMessage(self, ackdata, _, TTL): payload = self._doPOWDefaults( payload, TTL, log_prefix='(For ack message)', log_time=True) - return protocol.CreatePacket('object', payload) + return protocol.CreatePacket(b'object', payload) diff --git a/src/network/__init__.py b/src/network/__init__.py index 3cc890c0ef..1851e072de 100644 --- a/src/network/__init__.py +++ b/src/network/__init__.py @@ -12,7 +12,7 @@ def start(config, state): """Start network threads""" import state from .announcethread import AnnounceThread - import network.connectionpool # pylint: disable=relative-import + import network.connectionpool as connectionpool # pylint: disable=relative-import from .addrthread import AddrThread from .dandelion import Dandelion from .downloadthread import DownloadThread diff --git a/src/network/addrthread.py b/src/network/addrthread.py index 4f5de8abc1..f0e72f3705 100644 --- a/src/network/addrthread.py +++ b/src/network/addrthread.py @@ -5,7 +5,7 @@ # magic imports! import state -import network.connectionpool +import network.connectionpool as connectionpool from helper_random import randomshuffle from protocol import assembleAddrMessage from queues import addrQueue # FIXME: init with queue diff --git a/src/network/asyncore_pollchoose.py b/src/network/asyncore_pollchoose.py index bdd312c6f5..ccbe2aefad 100644 --- a/src/network/asyncore_pollchoose.py +++ b/src/network/asyncore_pollchoose.py @@ -723,20 +723,21 @@ def close(self): if why.args[0] not in (ENOTCONN, EBADF): raise + # XXX unresolved # cheap inheritance, used to pass all other attribute # references to the underlying socket object. - def __getattr__(self, attr): - try: - retattr = getattr(self.socket, attr) - except AttributeError: - raise AttributeError( - "%s instance has no attribute '%s'" - % (self.__class__.__name__, attr)) - else: - msg = "%(me)s.%(attr)s is deprecated; use %(me)s.socket.%(attr)s"\ - " instead" % {'me': self.__class__.__name__, 'attr': attr} - warnings.warn(msg, DeprecationWarning, stacklevel=2) - return retattr + #def __getattr__(self, attr): + # try: + # retattr = getattr(self.socket, attr) + # except AttributeError: + # raise AttributeError( + # "%s instance has no attribute '%s'" + # % (self.__class__.__name__, attr)) + # else: + # msg = "%(me)s.%(attr)s is deprecated; use %(me)s.socket.%(attr)s"\ + # " instead" % {'me': self.__class__.__name__, 'attr': attr} + # warnings.warn(msg, DeprecationWarning, stacklevel=2) + # return retattr # log and log_info may be overridden to provide more sophisticated # logging and warning methods. In general, log is for 'hit' logging diff --git a/src/network/bmproto.py b/src/network/bmproto.py index b800e87b3b..00967d1a52 100644 --- a/src/network/bmproto.py +++ b/src/network/bmproto.py @@ -12,10 +12,10 @@ # magic imports! import addresses -import network.knownnodes +import network.knownnodes as knownnodes import protocol import state -import network.connectionpool +import network.connectionpool as connectionpool from bmconfigparser import config from queues import invQueue, objectProcessorQueue, portCheckerQueue from randomtrackingdict import RandomTrackingDict @@ -82,7 +82,7 @@ def state_bm_header(self): """Process incoming header""" self.magic, self.command, self.payloadLength, self.checksum = \ protocol.Header.unpack(self.read_buf[:protocol.Header.size]) - self.command = self.command.rstrip('\x00') + self.command = self.command.rstrip(b'\x00') if self.magic != protocol.magic: # skip 1 byte in order to sync self.set_state("bm_header", length=1) @@ -107,18 +107,18 @@ def state_bm_command(self): # pylint: disable=too-many-branches self.invalid = True retval = True if not self.fullyEstablished and self.command not in ( - "error", "version", "verack"): + b"error", b"version", b"verack"): logger.error( 'Received command %s before connection was fully' - ' established, ignoring', self.command) + ' established, ignoring', self.command.decode()) self.invalid = True if not self.invalid: try: retval = getattr( - self, "bm_command_" + str(self.command).lower())() + self, "bm_command_" + self.command.decode().lower())() except AttributeError: # unimplemented command - logger.debug('unimplemented command %s', self.command) + logger.debug('unimplemented command %s', self.command.decode()) except BMProtoInsufficientDataError: logger.debug('packet length too short, skipping') except BMProtoExcessiveDataError: @@ -141,8 +141,8 @@ def state_bm_command(self): # pylint: disable=too-many-branches # broken read, ignore pass else: - logger.debug('Closing due to invalid command %s', self.command) - self.close_reason = "Invalid command %s" % self.command + logger.debug('Closing due to invalid command %s', self.command.decode()) + self.close_reason = "Invalid command %s" % self.command.decode() self.set_state("close") return False if retval: @@ -168,17 +168,17 @@ def decode_payload_node(self): """Decode node details from the payload""" # protocol.checkIPAddress() services, host, port = self.decode_payload_content("Q16sH") - if host[0:12] == '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF': - host = socket.inet_ntop(socket.AF_INET, str(host[12:16])) - elif host[0:6] == '\xfd\x87\xd8\x7e\xeb\x43': + if host[0:12] == b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF': + host = socket.inet_ntop(socket.AF_INET, host[12:16]) + elif host[0:6] == b'\xfd\x87\xd8\x7e\xeb\x43': # Onion, based on BMD/bitcoind - host = base64.b32encode(host[6:]).lower() + ".onion" + host = base64.b32encode(host[6:]).lower() + b".onion" else: - host = socket.inet_ntop(socket.AF_INET6, str(host)) - if host == "": + host = socket.inet_ntop(socket.AF_INET6, host) + if host == b"": # This can happen on Windows systems which are not 64-bit # compatible so let us drop the IPv6 address. - host = socket.inet_ntop(socket.AF_INET, str(host[12:16])) + host = socket.inet_ntop(socket.AF_INET, host[12:16]) return Node(services, host, port) @@ -443,13 +443,16 @@ def bm_command_addr(self): """Incoming addresses, process them""" # not using services for seenTime, stream, _, ip, port in self._decode_addr(): - ip = str(ip) - if ( - stream not in state.streamsInWhichIAmParticipating - # FIXME: should check against complete list - or ip.startswith('bootstrap') - ): + if (stream not in state.streamsInWhichIAmParticipating): continue + try: + if ( + # FIXME: should check against complete list + ip.decode().startswith('bootstrap') + ): + continue + except UnicodeDecodeError: + pass decodedIP = protocol.checkIPAddress(ip) if ( decodedIP and time.time() - seenTime > 0 @@ -477,7 +480,7 @@ def bm_command_portcheck(self): def bm_command_ping(self): """Incoming ping, respond to it.""" - self.append_write_buf(protocol.CreatePacket('pong')) + self.append_write_buf(protocol.CreatePacket(b'pong')) return True @staticmethod @@ -531,12 +534,12 @@ def bm_command_version(self): if not self.peerValidityChecks(): # ABORT afterwards return True - self.append_write_buf(protocol.CreatePacket('verack')) + self.append_write_buf(protocol.CreatePacket(b'verack')) self.verackSent = True ua_valid = re.match( - r'^/[a-zA-Z]+:[0-9]+\.?[\w\s\(\)\./:;-]*/$', self.userAgent) + r'^/[a-zA-Z]+:[0-9]+\.?[\w\s\(\)\./:;-]*/$', self.userAgent.decode()) if not ua_valid: - self.userAgent = '/INVALID:0/' + self.userAgent = b'/INVALID:0/' if not self.isOutbound: self.append_write_buf(protocol.assembleVersionMessage( self.destination.host, self.destination.port, diff --git a/src/network/connectionchooser.py b/src/network/connectionchooser.py index 687c43b04f..bedbd3ba1c 100644 --- a/src/network/connectionchooser.py +++ b/src/network/connectionchooser.py @@ -5,7 +5,7 @@ import logging import random -import network.knownnodes +import network.knownnodes as knownnodes import protocol import state from bmconfigparser import config @@ -45,7 +45,7 @@ def chooseConnection(stream): return getDiscoveredPeer() for _ in range(50): peer = random.choice( # nosec B311 - knownnodes.knownNodes[stream].keys()) + list(knownnodes.knownNodes[stream].keys())) try: peer_info = knownnodes.knownNodes[stream][peer] if peer_info.get('self'): diff --git a/src/network/connectionpool.py b/src/network/connectionpool.py index 61f20c46a7..3bb33b925c 100644 --- a/src/network/connectionpool.py +++ b/src/network/connectionpool.py @@ -10,7 +10,7 @@ import network.asyncore_pollchoose as asyncore import helper_random -import network.knownnodes +import network.knownnodes as knownnodes import protocol import state from bmconfigparser import config @@ -382,14 +382,14 @@ def loop(self): # pylint: disable=too-many-branches,too-many-statements minTx -= 300 - 20 if i.lastTx < minTx: if i.fullyEstablished: - i.append_write_buf(protocol.CreatePacket('ping')) + i.append_write_buf(protocol.CreatePacket(b'ping')) else: i.close_reason = "Timeout (%is)" % ( time.time() - i.lastTx) i.set_state("close") for i in ( self.connections() - + self.listeningSockets.values() + self.udpSockets.values() + + list(self.listeningSockets.values()) + list(self.udpSockets.values()) ): if not (i.accepting or i.connecting or i.connected): reaper.append(i) diff --git a/src/network/dandelion.py b/src/network/dandelion.py index 5a7131af82..02b34024d1 100644 --- a/src/network/dandelion.py +++ b/src/network/dandelion.py @@ -7,7 +7,7 @@ from threading import RLock from time import time -import network.connectionpool +import network.connectionpool as connectionpool import state from queues import invQueue diff --git a/src/network/downloadthread.py b/src/network/downloadthread.py index 3c87bc0329..a2e343f5bc 100644 --- a/src/network/downloadthread.py +++ b/src/network/downloadthread.py @@ -6,7 +6,7 @@ import addresses import helper_random import protocol -import network.connectionpool +import network.connectionpool as connectionpool from .objectracker import missingObjects from .threads import StoppableThread @@ -71,7 +71,7 @@ def run(self): if not chunkCount: continue payload[0:0] = addresses.encodeVarint(chunkCount) - i.append_write_buf(protocol.CreatePacket('getdata', payload)) + i.append_write_buf(protocol.CreatePacket(b'getdata', payload)) self.logger.debug( '%s:%i Requesting %i objects', i.destination.host, i.destination.port, chunkCount) diff --git a/src/network/invthread.py b/src/network/invthread.py index 99b04baea9..4eba920534 100644 --- a/src/network/invthread.py +++ b/src/network/invthread.py @@ -8,7 +8,7 @@ import addresses import protocol import state -import network.connectionpool +import network.connectionpool as connectionpool from queues import invQueue from .threads import StoppableThread @@ -90,13 +90,13 @@ def run(self): # pylint: disable=too-many-branches if fluffs: random.shuffle(fluffs) connection.append_write_buf(protocol.CreatePacket( - 'inv', + b'inv', addresses.encodeVarint( len(fluffs)) + ''.join(fluffs))) if stems: random.shuffle(stems) connection.append_write_buf(protocol.CreatePacket( - 'dinv', + b'dinv', addresses.encodeVarint( len(stems)) + ''.join(stems))) diff --git a/src/network/networkthread.py b/src/network/networkthread.py index 298e41e7e4..4a49896a21 100644 --- a/src/network/networkthread.py +++ b/src/network/networkthread.py @@ -3,7 +3,7 @@ """ import network.asyncore_pollchoose as asyncore import state -import network.connectionpool +import network.connectionpool as connectionpool from queues import excQueue from .threads import StoppableThread diff --git a/src/network/objectracker.py b/src/network/objectracker.py index 3fe9444ff4..abaefad74f 100644 --- a/src/network/objectracker.py +++ b/src/network/objectracker.py @@ -5,7 +5,7 @@ from threading import RLock import state -import network.connectionpool +import network.connectionpool as connectionpool from randomtrackingdict import RandomTrackingDict haveBloom = False diff --git a/src/network/receivequeuethread.py b/src/network/receivequeuethread.py index 6c755577d2..68ad612405 100644 --- a/src/network/receivequeuethread.py +++ b/src/network/receivequeuethread.py @@ -6,7 +6,7 @@ import socket import state -import network.connectionpool +import network.connectionpool as connectionpool from network.advanceddispatcher import UnknownStateError from queues import receiveDataQueue from .threads import StoppableThread diff --git a/src/network/stats.py b/src/network/stats.py index 217ecc0843..f37fd298bc 100644 --- a/src/network/stats.py +++ b/src/network/stats.py @@ -4,7 +4,7 @@ import time import network.asyncore_pollchoose as asyncore -import network.connectionpool +import network.connectionpool as connectionpool from .objectracker import missingObjects diff --git a/src/network/tcp.py b/src/network/tcp.py index 267a3e2299..23866c9e2c 100644 --- a/src/network/tcp.py +++ b/src/network/tcp.py @@ -15,14 +15,14 @@ import l10n import protocol import state -import network.connectionpool +import network.connectionpool as connectionpool from bmconfigparser import config from highlevelcrypto import randomBytes from queues import invQueue, receiveDataQueue, UISignalQueue from tr import _translate import network.asyncore_pollchoose as asyncore -import network.knownnodes +import network.knownnodes as knownnodes from network.advanceddispatcher import AdvancedDispatcher from network.bmproto import BMProto from network.objectracker import ObjectTracker @@ -180,6 +180,15 @@ def sendAddr(self): maxAddrCount = config.safeGetInt( "bitmessagesettings", "maxaddrperstreamsend", 500) + def endsWith(s, tail): + try: + return s.endswith(tail) + except: + try: + return s.decode().endswith(tail) + except UnicodeDecodeError: + return False + templist = [] addrs = {} for stream in self.streams: @@ -194,7 +203,7 @@ def sendAddr(self): (k, v) for k, v in nodes.items() if v["lastseen"] > int(time.time()) - maximumAgeOfNodesThatIAdvertiseToOthers - and v["rating"] >= 0 and not k.host.endswith('.onion') + and v["rating"] >= 0 and not endsWith(k.host, '.onion') ] # sent 250 only if the remote isn't interested in it elemCount = min( @@ -220,7 +229,7 @@ def sendChunk(): 'Sending huge inv message with %i objects to just this' ' one peer', objectCount) self.append_write_buf(protocol.CreatePacket( - 'inv', addresses.encodeVarint(objectCount) + payload)) + b'inv', addresses.encodeVarint(objectCount) + payload)) # Select all hashes for objects in this stream. bigInvList = {} diff --git a/src/network/uploadthread.py b/src/network/uploadthread.py index 6b76e58527..eff7d42ac5 100644 --- a/src/network/uploadthread.py +++ b/src/network/uploadthread.py @@ -49,7 +49,7 @@ def run(self): break try: payload.extend(protocol.CreatePacket( - 'object', state.Inventory[chunk].payload)) + b'object', state.Inventory[chunk].payload)) chunk_count += 1 except KeyError: i.antiIntersectionDelay() diff --git a/src/protocol.py b/src/protocol.py index d1a5f86556..608343fdbb 100644 --- a/src/protocol.py +++ b/src/protocol.py @@ -173,7 +173,7 @@ def checkIPAddress(host, private=False): return checkIPv4Address(host[12:], hostStandardFormat, private) elif host[0:6] == b'\xfd\x87\xd8\x7e\xeb\x43': # Onion, based on BMD/bitcoind - hostStandardFormat = base64.b32encode(host[6:]).lower() + ".onion" + hostStandardFormat = base64.b32encode(host[6:]).lower() + b".onion" if private: return False return hostStandardFormat @@ -250,6 +250,8 @@ def haveSSL(server=False): python < 2.7.9's ssl library does not support ECDSA server due to missing initialisation of available curves, but client works ok """ + # XXX debug - disable TLS + return False if not server: return True elif sys.version_info >= (2, 7, 9): diff --git a/src/qidenticon.py b/src/qidenticon.py index 13be357806..158a2232d9 100644 --- a/src/qidenticon.py +++ b/src/qidenticon.py @@ -41,12 +41,7 @@ """ from six.moves import range - -try: - from PyQt5 import QtCore, QtGui -except (ImportError, RuntimeError): - from PyQt4 import QtCore, QtGui - +from PyQt6 import QtCore, QtGui class IdenticonRendererBase(object): """Encapsulate methods around rendering identicons""" @@ -129,11 +124,13 @@ def drawPatchQt( QtCore.QPointF(size, size), QtCore.QPointF(0., size)] rotation = [0, 90, 180, 270] - nopen = QtGui.QPen(foreColor, QtCore.Qt.NoPen) - foreBrush = QtGui.QBrush(foreColor, QtCore.Qt.SolidPattern) + nopen = QtGui.QPen(foreColor) + nopen.setStyle(QtCore.Qt.PenStyle.NoPen) + foreBrush = QtGui.QBrush(foreColor, QtCore.Qt.BrushStyle.SolidPattern) if penwidth > 0: pen_color = QtGui.QColor(255, 255, 255) - pen = QtGui.QPen(pen_color, QtCore.Qt.SolidPattern) + pen = QtGui.QPen(pen_color) + pen.setBrush(QtCore.Qt.BrushStyle.SolidPattern) pen.setWidth(penwidth) painter = QtGui.QPainter() @@ -153,10 +150,10 @@ def drawPatchQt( if penwidth > 0: # draw the borders painter.setPen(pen) - painter.drawPolygon(polygon, QtCore.Qt.WindingFill) + painter.drawPolygon(polygon, QtCore.Qt.FillRule.WindingFill) # draw the fill painter.setPen(nopen) - painter.drawPolygon(polygon, QtCore.Qt.WindingFill) + painter.drawPolygon(polygon, QtCore.Qt.FillRule.WindingFill) painter.end() diff --git a/src/shutdown.py b/src/shutdown.py index 441d655eef..7c7443869e 100644 --- a/src/shutdown.py +++ b/src/shutdown.py @@ -23,7 +23,7 @@ def doCleanShutdown(): objectProcessorQueue.put(('checkShutdownVariable', 'no data')) for thread in threading.enumerate(): - if thread.isAlive() and isinstance(thread, StoppableThread): + if thread.is_alive() and isinstance(thread, StoppableThread): thread.stopThread() UISignalQueue.put(( diff --git a/src/storage/sqlite.py b/src/storage/sqlite.py index eb5df098d8..385434e5dd 100644 --- a/src/storage/sqlite.py +++ b/src/storage/sqlite.py @@ -33,7 +33,7 @@ def __contains__(self, hash_): return True rows = sqlQuery( 'SELECT streamnumber FROM inventory WHERE hash=?', - sqlite3.Binary(hash_)) + sqlite3.Binary(hash_.encode())) if not rows: return False self._objects[hash_] = rows[0][0] @@ -44,8 +44,8 @@ def __getitem__(self, hash_): if hash_ in self._inventory: return self._inventory[hash_] rows = sqlQuery( - 'SELECT objecttype, streamnumber, payload, expirestime, tag' - ' FROM inventory WHERE hash=?', sqlite3.Binary(hash_)) + b'SELECT objecttype, streamnumber, payload, expirestime, tag' + b' FROM inventory WHERE hash=?', sqlite3.Binary(hash_.encode())) if not rows: raise KeyError(hash_) return InventoryItem(*rows[0]) diff --git a/src/tr.py b/src/tr.py index 6aca4664e9..06e2e5d823 100644 --- a/src/tr.py +++ b/src/tr.py @@ -28,7 +28,7 @@ def arg(self, _): return self.text -def _translate(context, text, disambiguation=None, encoding=None, n=None): +def _translate(context, text, disambiguation=None, n=None): # pylint: disable=unused-argument return translateText(context, text, n) @@ -52,7 +52,7 @@ def translateText(context, text, n=None): os._exit(0) # pylint: disable=protected-access if n is None: return QtWidgets.QApplication.translate(context, text) - return QtGui.QApplication.translate(context, text, None, QtCore.QCoreApplication.CodecForTr, n) + return QtWidgets.QApplication.translate(context, text, None, n) else: if '%' in text: return translateClass(context, text.replace('%', '', 1)) From 16019d40837beb32b75d18fbd4d865ebd3f70fb1 Mon Sep 17 00:00:00 2001 From: Kashiko Koibumi Date: Mon, 13 May 2024 22:00:48 +0900 Subject: [PATCH 03/32] enable TLS connection --- .gitignore | 1 + src/bitmessageqt/__init__.py | 4 ++-- src/network/httpd.py | 2 +- src/network/https.py | 2 +- src/network/knownnodes.py | 2 ++ src/network/tls.py | 27 +++++++++++++++++++-------- src/protocol.py | 2 -- 7 files changed, 26 insertions(+), 14 deletions(-) diff --git a/.gitignore b/.gitignore index fc331499e8..6bc048a586 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,4 @@ coverage.xml **coverage.json .buildozer .tox +*.swp diff --git a/src/bitmessageqt/__init__.py b/src/bitmessageqt/__init__.py index 3e66c364e4..e9aabc1bb5 100644 --- a/src/bitmessageqt/__init__.py +++ b/src/bitmessageqt/__init__.py @@ -1386,7 +1386,7 @@ def _noop_update(*args, **kwargs): # initialise the message notifier def notifierInit(self): def _simple_notify( - title, subtitle, category, label=None, icon=None): + title, subtitle, category, label=None, icon=QtWidgets.QSystemTrayIcon.MessageIcon.Information): self.tray.showMessage(title, subtitle, icon, 2000) self._notifier = _simple_notify @@ -1416,7 +1416,7 @@ def _simple_notify( logger.warning("No notification.sound plugin found") def notifierShow( - self, title, subtitle, category, label=None, icon=None): + self, title, subtitle, category, label=None, icon=QtWidgets.QSystemTrayIcon.MessageIcon.Information): self.playSound(category, label) self._notifier( str(title), str(subtitle), category, label, icon) diff --git a/src/network/httpd.py b/src/network/httpd.py index b69ffa990e..654566c28d 100644 --- a/src/network/httpd.py +++ b/src/network/httpd.py @@ -5,7 +5,7 @@ import asyncore import socket -from tls import TLSHandshake +from .tls import TLSHandshake class HTTPRequestHandler(asyncore.dispatcher): diff --git a/src/network/https.py b/src/network/https.py index a7b8b57ceb..2ecf01f68e 100644 --- a/src/network/https.py +++ b/src/network/https.py @@ -1,7 +1,7 @@ import asyncore from http import HTTPClient -from tls import TLSHandshake +from .tls import TLSHandshake """ self.sslSock = ssl.wrap_socket( diff --git a/src/network/knownnodes.py b/src/network/knownnodes.py index 01aa4729fd..7d21400104 100644 --- a/src/network/knownnodes.py +++ b/src/network/knownnodes.py @@ -108,6 +108,8 @@ def addKnownNode(stream, peer, lastseen=None, is_self=False): Returns True if added a new node. """ # pylint: disable=too-many-branches + if not isinstance(peer.host, str): + peer = Peer(peer.host.decode(), peer.port) if isinstance(stream, Iterable): with knownNodesLock: for s in stream: diff --git a/src/network/tls.py b/src/network/tls.py index 7d76c48edd..2f30fcc025 100644 --- a/src/network/tls.py +++ b/src/network/tls.py @@ -40,7 +40,6 @@ else: sslProtocolCiphers = "AECDH-AES256-SHA" - class TLSDispatcher(AdvancedDispatcher): """TLS functionality for classes derived from AdvancedDispatcher""" # pylint: disable=too-many-instance-attributes, too-many-arguments @@ -58,17 +57,22 @@ def __init__(self, _=None, sock=None, certfile=None, keyfile=None, self.tlsDone = False self.tlsVersion = "N/A" self.isSSL = False + self.tlsPrepared = False def state_tls_init(self): """Prepare sockets for TLS handshake""" self.isSSL = True self.tlsStarted = True + + self.want_read = self.want_write = True + self.set_state("tls_handshake") + return False + + def do_tls_init(self): # Once the connection has been established, # it's safe to wrap the socket. if sys.version_info >= (2, 7, 9): - context = ssl.create_default_context( - purpose=ssl.Purpose.SERVER_AUTH - if self.server_side else ssl.Purpose.CLIENT_AUTH) + context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) context.set_ciphers(self.ciphers) context.set_ecdh_curve("secp256k1") context.check_hostname = False @@ -76,7 +80,7 @@ def state_tls_init(self): # 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 + ssl.OP_CIPHER_SERVER_PREFERENCE | ssl.OP_NO_TLSv1_3 self.sslSocket = context.wrap_socket( self.socket, server_side=self.server_side, do_handshake_on_connect=False) @@ -88,7 +92,6 @@ def state_tls_init(self): ciphers=self.ciphers, do_handshake_on_connect=False) self.sslSocket.setblocking(0) self.want_read = self.want_write = True - self.set_state("tls_handshake") return False @staticmethod @@ -134,7 +137,11 @@ def handle_read(self): try: # wait for write buffer flush if self.tlsStarted and not self.tlsDone and not self.write_buf: - self.tls_handshake() + if not self.tlsPrepared: + self.do_tls_init() + self.tlsPrepared = True + else: + self.tls_handshake() else: AdvancedDispatcher.handle_read(self) except AttributeError: @@ -156,7 +163,11 @@ def handle_write(self): try: # wait for write buffer flush if self.tlsStarted and not self.tlsDone and not self.write_buf: - self.tls_handshake() + if not self.tlsPrepared: + self.do_tls_init() + self.tlsPrepared = True + else: + self.tls_handshake() else: AdvancedDispatcher.handle_write(self) except AttributeError: diff --git a/src/protocol.py b/src/protocol.py index 608343fdbb..d1d2771fbd 100644 --- a/src/protocol.py +++ b/src/protocol.py @@ -250,8 +250,6 @@ def haveSSL(server=False): python < 2.7.9's ssl library does not support ECDSA server due to missing initialisation of available curves, but client works ok """ - # XXX debug - disable TLS - return False if not server: return True elif sys.version_info >= (2, 7, 9): From e646377f22ffb8f92f3c1ff3ee1636fc9dd361b1 Mon Sep 17 00:00:00 2001 From: Kashiko Koibumi Date: Tue, 14 May 2024 16:34:27 +0900 Subject: [PATCH 04/32] fix GUIs to work with PyQt6 Unresolved problems: * File->Quit menu does not work. * Validator in add chan dialog does not work. --- src/bitmessageqt/__init__.py | 246 +++++++++---------- src/bitmessageqt/account.py | 5 +- src/bitmessageqt/address_dialogs.py | 32 ++- src/bitmessageqt/addressvalidator.py | 42 ++-- src/bitmessageqt/bitmessageui.py | 185 +++----------- src/bitmessageqt/bitmessageui.py.diff | 332 ++++++++++++++++++++++---- src/bitmessageqt/blacklist.py | 28 +-- src/bitmessageqt/foldertree.py | 49 ++-- src/bitmessageqt/languagebox.py | 10 +- src/bitmessageqt/messagecompose.py | 5 +- src/bitmessageqt/networkstatus.py | 2 +- src/bitmessageqt/newaddressdialog.ui | 4 +- src/bitmessageqt/newchandialog.py | 59 ++--- src/bitmessageqt/settings.py | 22 +- src/bitmessageqt/support.py | 12 +- src/class_addressGenerator.py | 8 +- src/highlevelcrypto.py | 2 +- 17 files changed, 574 insertions(+), 469 deletions(-) diff --git a/src/bitmessageqt/__init__.py b/src/bitmessageqt/__init__.py index e9aabc1bb5..b7c19bfd24 100644 --- a/src/bitmessageqt/__init__.py +++ b/src/bitmessageqt/__init__.py @@ -36,14 +36,14 @@ MessageList_AddressWidget, MessageList_SubjectWidget, Ui_AddressBookWidgetItemLabel, Ui_AddressBookWidgetItemAddress, MessageList_TimeWidget) -import bitmessageqt.settingsmixin -import bitmessageqt.support +import bitmessageqt.settingsmixin as settingsmixin +import bitmessageqt.support as support from helper_sql import sqlQuery, sqlExecute, sqlExecuteChunked, sqlStoredProcedure import helper_addressbook import helper_search import l10n from .utils import str_broadcast_subscribers, avatarize -import bitmessageqt.dialogs +import bitmessageqt.dialogs as dialogs from network.stats import pendingDownload, pendingUpload from .uisignaler import UISignaler import paths @@ -51,9 +51,9 @@ import queues import shutdown from .statusbar import BMStatusBar -import bitmessageqt.sound +import bitmessageqt.sound as sound # This is needed for tray icon -import bitmessageqt.bitmessage_icons_rc # noqa:F401 pylint: disable=unused-import +import bitmessageqt.bitmessage_icons_rc as bitmessage_icons_rc # noqa:F401 pylint: disable=unused-import import helper_sent try: @@ -99,12 +99,12 @@ def change_translation(self, newlocale=None): newlocale = l10n.getTranslationLanguage() try: if not self.qmytranslator.isEmpty(): - QtGui.QApplication.removeTranslator(self.qmytranslator) + QtWidgets.QApplication.removeTranslator(self.qmytranslator) except: pass try: if not self.qsystranslator.isEmpty(): - QtGui.QApplication.removeTranslator(self.qsystranslator) + QtWidgets.QApplication.removeTranslator(self.qsystranslator) except: pass @@ -377,7 +377,7 @@ def init_sent_popup_menu(self, connectSignal=True): self.actionSentReply = self.ui.sentContextMenuToolbar.addAction( _translate("MainWindow", "Send update"), self.on_action_SentReply) - # self.popMenuSent = QtGui.QMenu( self ) + # self.popMenuSent = QtWidgets.QMenu( self ) # self.popMenuSent.addAction( self.actionSentClipboard ) # self.popMenuSent.addAction( self.actionTrashSentMessage ) @@ -612,9 +612,9 @@ def __init__(self, parent=None): "One of your addresses, {0}, is an old version 1 address. " "Version 1 addresses are no longer supported. " "May we delete it now?").format(addressInKeysFile) - reply = QtGui.QMessageBox.question( - self, 'Message', displayMsg, QtGui.QMessageBox.StandardButton.Yes, QtGui.QMessageBox.StandardButton.No) - if reply == QtGui.QMessageBox.StandardButton.Yes: + reply = QtWidgets.QMessageBox.question( + self, 'Message', displayMsg, QtWidgets.QMessageBox.StandardButton.Yes, QtWidgets.QMessageBox.StandardButton.No) + if reply == QtWidgets.QMessageBox.StandardButton.Yes: config.remove_section(addressInKeysFile) config.save() @@ -997,7 +997,7 @@ def propagateUnreadCount(self, folder=None, widget=None): for i in range(root.childCount()): addressItem = root.child(i) if addressItem.type == AccountMixin.ALL: - newCount = sum(totalUnread.itervalues()) + newCount = sum(totalUnread.values()) self.drawTrayIcon(self.currentTrayIconFileName, newCount) else: try: @@ -1005,7 +1005,7 @@ def propagateUnreadCount(self, folder=None, widget=None): broadcastsUnread if addressItem.type == AccountMixin.SUBSCRIPTION else normalUnread - )[addressItem.address].itervalues()) + )[addressItem.address].values()) except KeyError: newCount = 0 if newCount != addressItem.unreadCount: @@ -1108,11 +1108,11 @@ def addMessageListItemSent( items = [ MessageList_AddressWidget( - toAddress, str(acct.toLabel, 'utf-8')), + toAddress, acct.toLabel), MessageList_AddressWidget( - fromAddress, str(acct.fromLabel, 'utf-8')), + fromAddress, acct.fromLabel), MessageList_SubjectWidget( - str(subject), str(acct.subject, 'utf-8', 'replace')), + subject, acct.subject), MessageList_TimeWidget( statusText, False, lastactiontime, ackdata)] self.addMessageListItem(tableWidget, items) @@ -1133,11 +1133,11 @@ def addMessageListItemInbox( items = [ MessageList_AddressWidget( - toAddress, str(acct.toLabel, 'utf-8'), not read), + toAddress, acct.toLabel, not read), MessageList_AddressWidget( - fromAddress, str(acct.fromLabel, 'utf-8'), not read), + fromAddress, acct.fromLabel, not read), MessageList_SubjectWidget( - str(subject), str(acct.subject, 'utf-8', 'replace'), + subject, acct.subject, not read), MessageList_TimeWidget( l10n.formatTimestamp(received), not read, received, msgid) @@ -1168,7 +1168,7 @@ def loadSent(self, tableWidget, account, where="", what=""): self.addMessageListItemSent(tableWidget, *row) tableWidget.horizontalHeader().setSortIndicator( - 3, QtCore.Qt.DescendingOrder) + 3, QtCore.Qt.SortOrder.DescendingOrder) tableWidget.setSortingEnabled(True) tableWidget.horizontalHeaderItem(3).setText( _translate("MainWindow", "Sent")) @@ -1211,7 +1211,7 @@ def loadMessagelist( msgid, received, read) tableWidget.horizontalHeader().setSortIndicator( - 3, QtCore.Qt.DescendingOrder) + 3, QtCore.Qt.SortOrder.DescendingOrder) tableWidget.setSortingEnabled(True) tableWidget.selectRow(0) tableWidget.horizontalHeaderItem(3).setText( @@ -1431,7 +1431,7 @@ def addressbookKeyPressEvent(self, event): if event.key() == QtCore.Qt.Key_Delete: self.on_action_AddressBookDelete() else: - return QtGui.QTableWidget.keyPressEvent( + return QtWidgets.QTableWidget.keyPressEvent( self.ui.tableWidgetAddressBook, event) # inbox / sent @@ -1446,14 +1446,14 @@ def handleKeyPress(self, event, focus=None): """This method handles keypress events for all widgets on MyForm""" messagelist = self.getCurrentMessagelist() if event.key() == QtCore.Qt.Key_Delete: - if isinstance(focus, (MessageView, QtGui.QTableWidget)): + if isinstance(focus, (MessageView, QtWidgets.QTableWidget)): folder = self.getCurrentFolder() if folder == "sent": self.on_action_SentTrash() else: self.on_action_InboxTrash() event.ignore() - elif QtGui.QApplication.queryKeyboardModifiers() == QtCore.Qt.NoModifier: + elif QtWidgets.QApplication.queryKeyboardModifiers() == QtCore.Qt.NoModifier: if event.key() == QtCore.Qt.Key_N: currentRow = messagelist.currentRow() if currentRow < messagelist.rowCount() - 1: @@ -1492,20 +1492,20 @@ def handleKeyPress(self, event, focus=None): return if isinstance(focus, MessageView): return MessageView.keyPressEvent(focus, event) - if isinstance(focus, QtGui.QTableWidget): - return QtGui.QTableWidget.keyPressEvent(focus, event) - if isinstance(focus, QtGui.QTreeWidget): - return QtGui.QTreeWidget.keyPressEvent(focus, event) + if isinstance(focus, QtWidgets.QTableWidget): + return QtWidgets.QTableWidget.keyPressEvent(focus, event) + if isinstance(focus, QtWidgets.QTreeWidget): + return QtWidgets.QTreeWidget.keyPressEvent(focus, event) # menu button 'manage keys' def click_actionManageKeys(self): if 'darwin' in sys.platform or 'linux' in sys.platform: if state.appdata == '': - # reply = QtGui.QMessageBox.information(self, 'keys.dat?','You + # reply = QtWidgets.QMessageBox.information(self, 'keys.dat?','You # may manage your keys by editing the keys.dat file stored in # the same directory as this program. It is important that you # back up this file.', QMessageBox.StandardButton.Ok) - reply = QtGui.QMessageBox.information( + reply = QtWidgets.QMessageBox.information( self, 'keys.dat?', _translate( @@ -1513,10 +1513,10 @@ def click_actionManageKeys(self): "You may manage your keys by editing the keys.dat file stored in the same directory" "as this program. It is important that you back up this file." ), - QtGui.QMessageBox.StandardButton.Ok) + QtWidgets.QMessageBox.StandardButton.Ok) else: - QtGui.QMessageBox.information( + QtWidgets.QMessageBox.information( self, 'keys.dat?', _translate( @@ -1525,10 +1525,10 @@ def click_actionManageKeys(self): "\n {0} \n" "It is important that you back up this file." ).format(state.appdata), - QtGui.QMessageBox.StandardButton.Ok) + QtWidgets.QMessageBox.StandardButton.Ok) elif sys.platform == 'win32' or sys.platform == 'win64': if state.appdata == '': - reply = QtGui.QMessageBox.question( + reply = QtWidgets.QMessageBox.question( self, _translate("MainWindow", "Open keys.dat?"), _translate( @@ -1537,10 +1537,10 @@ def click_actionManageKeys(self): "this program. It is important that you back up this file. " "Would you like to open the file now? " "(Be sure to close Bitmessage before making any changes.)"), - QtGui.QMessageBox.StandardButton.Yes, - QtGui.QMessageBox.StandardButton.No) + QtWidgets.QMessageBox.StandardButton.Yes, + QtWidgets.QMessageBox.StandardButton.No) else: - reply = QtGui.QMessageBox.question( + reply = QtWidgets.QMessageBox.question( self, _translate("MainWindow", "Open keys.dat?"), _translate( @@ -1548,18 +1548,18 @@ def click_actionManageKeys(self): "You may manage your keys by editing the keys.dat file stored in\n {0} \n" "It is important that you back up this file. Would you like to open the file now?" "(Be sure to close Bitmessage before making any changes.)").format(state.appdata), - QtGui.QMessageBox.StandardButton.Yes, QtGui.QMessageBox.StandardButton.No) - if reply == QtGui.QMessageBox.StandardButton.Yes: + QtWidgets.QMessageBox.StandardButton.Yes, QtWidgets.QMessageBox.StandardButton.No) + if reply == QtWidgets.QMessageBox.StandardButton.Yes: openKeysFile() # menu button 'delete all treshed messages' def click_actionDeleteAllTrashedMessages(self): - if QtGui.QMessageBox.question( + if QtWidgets.QMessageBox.question( self, _translate("MainWindow", "Delete trash?"), _translate("MainWindow", "Are you sure you want to delete all trashed messages?"), - QtGui.QMessageBox.StandardButton.Yes, - QtGui.QMessageBox.StandardButton.No) == QtGui.QMessageBox.StandardButton.No: + QtWidgets.QMessageBox.StandardButton.Yes, + QtWidgets.QMessageBox.StandardButton.No) == QtWidgets.QMessageBox.StandardButton.No: return sqlStoredProcedure('deleteandvacuume') self.rerenderTabTreeMessages() @@ -1584,9 +1584,9 @@ def click_actionDeleteAllTrashedMessages(self): # menu button 'regenerate deterministic addresses' def click_actionRegenerateDeterministicAddresses(self): dialog = dialogs.RegenerateAddressesDialog(self) - if dialog.exec_(): + if dialog.exec(): if dialog.lineEditPassphrase.text() == "": - QtGui.QMessageBox.about( + QtWidgets.QMessageBox.about( self, _translate("MainWindow", "bad passphrase"), _translate( "MainWindow", @@ -1599,7 +1599,7 @@ def click_actionRegenerateDeterministicAddresses(self): addressVersionNumber = int( dialog.lineEditAddressVersionNumber.text()) except: - QtGui.QMessageBox.about( + QtWidgets.QMessageBox.about( self, _translate("MainWindow", "Bad address version number"), _translate( @@ -1609,7 +1609,7 @@ def click_actionRegenerateDeterministicAddresses(self): )) return if addressVersionNumber < 3 or addressVersionNumber > 4: - QtGui.QMessageBox.about( + QtWidgets.QMessageBox.about( self, _translate("MainWindow", "Bad address version number"), _translate( @@ -1622,7 +1622,7 @@ def click_actionRegenerateDeterministicAddresses(self): addressVersionNumber, streamNumberForAddress, "regenerated deterministic address", dialog.spinBoxNumberOfAddressesToMake.value(), - dialog.lineEditPassphrase.text().toUtf8(), + dialog.lineEditPassphrase.text(), dialog.checkBoxEighteenByteRipe.isChecked() )) self.ui.tabWidget.setCurrentIndex( @@ -1648,7 +1648,7 @@ def showConnectDialog(self): def showMigrationWizard(self, level): self.migrationWizardInstance = Ui_MigrationWizard(["a"]) - if self.migrationWizardInstance.exec_(): + if self.migrationWizardInstance.exec(): pass else: pass @@ -1673,7 +1673,7 @@ def changeEvent(self, event): pass def __icon_activated(self, reason): - if reason == QtGui.QSystemTrayIcon.Trigger: + if reason == QtWidgets.QSystemTrayIcon.Trigger: self.actionShow.setChecked(not self.actionShow.isChecked()) self.appIndicatorShowOrHideWindow() @@ -1775,8 +1775,9 @@ def calcTrayIcon(self, iconFileName, inboxUnreadCount): # draw text painter = QtGui.QPainter() painter.begin(pixmap) - painter.setPen( - QtGui.QPen(QtGui.QColor(255, 0, 0), QtCore.Qt.SolidPattern)) + pen = QtGui.QPen(QtGui.QColor(255, 0, 0)) + pen.setBrush(QtGui.QBrush(QtCore.Qt.BrushStyle.SolidPattern)) + painter.setPen(pen) painter.setFont(font) painter.drawText(24-rect.right()-marginX, -rect.top()+marginY, txt) painter.end() @@ -1819,7 +1820,7 @@ def updateSentItemStatusByToAddress(self, toAddress, textToDisplay): continue for i in range(sent.rowCount()): - rowAddress = sent.item(i, 0).data(QtCore.Qt.UserRole) + rowAddress = sent.item(i, 0).data(QtCore.Qt.ItemDataRole.UserRole) if toAddress == rowAddress: sent.item(i, 3).setToolTip(textToDisplay) try: @@ -1846,7 +1847,7 @@ def updateSentItemStatusByAckdata(self, ackdata, textToDisplay): if self.getCurrentFolder(treeWidget) != "sent": continue for i in range(sent.rowCount()): - toAddress = sent.item(i, 0).data(QtCore.Qt.UserRole) + toAddress = sent.item(i, 0).data(QtCore.Qt.ItemDataRole.UserRole) tableAckdata = sent.item(i, 3).data() status, addressVersionNumber, streamNumber, ripe = decodeAddress( toAddress) @@ -1897,7 +1898,7 @@ def newVersionAvailable(self, version): def displayAlert(self, title, text, exitAfterUserClicksOk): self.updateStatusBar(text) - QtGui.QMessageBox.critical(self, title, text, QtGui.QMessageBox.StandardButton.Ok) + QtWidgets.QMessageBox.critical(self, title, text, QtWidgets.QMessageBox.StandardButton.Ok) if exitAfterUserClicksOk: os._exit(0) @@ -1973,7 +1974,7 @@ def rerenderSubscriptions(self): self.rerenderTabTreeSubscriptions() def click_pushButtonTTL(self): - QtGui.QMessageBox.information( + QtWidgets.QMessageBox.information( self, 'Time To Live', _translate( @@ -1982,16 +1983,20 @@ def click_pushButtonTTL(self): ,it will resend the message automatically. The longer the Time-To-Live, the more work your computer must do to send the message. A Time-To-Live of four or five days is often appropriate."""), - QtGui.QMessageBox.StandardButton.Ok) + QtWidgets.QMessageBox.StandardButton.Ok) def click_pushButtonClear(self): self.ui.lineEditSubject.setText("") self.ui.lineEditTo.setText("") - self.ui.textEditMessage.reset() + self.ui.textEditMessage.clear() self.ui.comboBoxSendFrom.setCurrentIndex(0) + self.ui.comboBoxSendFromBroadcast.setCurrentIndex(0) + self.ui.lineEditSubjectBroadcast.setText('') + self.ui.textEditMessageBroadcast.clear() + def click_pushButtonSend(self): - encoding = 3 if QtGui.QApplication.queryKeyboardModifiers() & QtCore.Qt.ShiftModifier else 2 + encoding = 3 if QtWidgets.QApplication.queryKeyboardModifiers() & QtCore.Qt.KeyboardModifier.ShiftModifier else 2 self.statusbar.clearMessage() @@ -1999,22 +2004,20 @@ def click_pushButtonSend(self): self.ui.tabWidgetSend.indexOf(self.ui.sendDirect): # message to specific people sendMessageToPeople = True - fromAddress = str(self.ui.comboBoxSendFrom.itemData( + fromAddress = self.ui.comboBoxSendFrom.itemData( self.ui.comboBoxSendFrom.currentIndex(), - QtCore.Qt.UserRole).toString()) - toAddresses = str(self.ui.lineEditTo.text().toUtf8()) - subject = str(self.ui.lineEditSubject.text().toUtf8()) - message = str( - self.ui.textEditMessage.document().toPlainText().toUtf8()) + QtCore.Qt.ItemDataRole.UserRole) + toAddresses = self.ui.lineEditTo.text() + subject = self.ui.lineEditSubject.text() + message = self.ui.textEditMessage.document().toPlainText() else: # broadcast message sendMessageToPeople = False - fromAddress = str(self.ui.comboBoxSendFromBroadcast.itemData( + fromAddress = self.ui.comboBoxSendFromBroadcast.itemData( self.ui.comboBoxSendFromBroadcast.currentIndex(), - QtCore.Qt.UserRole).toString()) - subject = str(self.ui.lineEditSubjectBroadcast.text().toUtf8()) - message = str( - self.ui.textEditMessageBroadcast.document().toPlainText().toUtf8()) + QtCore.Qt.ItemDataRole.UserRole) + subject = self.ui.lineEditSubjectBroadcast.text() + message = self.ui.textEditMessageBroadcast.document().toPlainText() """ The whole network message must fit in 2^18 bytes. Let's assume 500 bytes of overhead. If someone wants to get that @@ -2023,7 +2026,7 @@ def click_pushButtonSend(self): users can send messages of any length. """ if len(message) > (2 ** 18 - 500): - QtGui.QMessageBox.about( + QtWidgets.QMessageBox.about( self, _translate("MainWindow", "Message too long"), _translate( "MainWindow", @@ -2055,14 +2058,14 @@ def click_pushButtonSend(self): subject = acct.subject toAddress = acct.toAddress else: - if QtGui.QMessageBox.question( + if QtWidgets.QMessageBox.question( self, "Sending an email?", _translate( "MainWindow", "You are trying to send an email instead of a bitmessage. " "This requires registering with a gateway. Attempt to register?"), - QtGui.QMessageBox.StandardButton.Yes|QtGui.QMessageBox.StandardButton.No) != QtGui.QMessageBox.StandardButton.Yes: + QtWidgets.QMessageBox.StandardButton.Yes|QtWidgets.QMessageBox.StandardButton.No) != QtWidgets.QMessageBox.StandardButton.Yes: continue email = acct.getLabel() if email[-14:] != "@mailchuck.com": # attempt register @@ -2087,7 +2090,7 @@ def click_pushButtonSend(self): status, addressVersionNumber, streamNumber = decodeAddress(toAddress)[:3] if status != 'success': try: - toAddress = str(toAddress, 'utf-8', 'ignore') + toAddress = toAddress except: pass logger.error('Error: Could not decode recipient address ' + toAddress + ':' + status) @@ -2159,7 +2162,7 @@ def click_pushButtonSend(self): toAddress = addBMIfNotPresent(toAddress) if addressVersionNumber > 4 or addressVersionNumber <= 1: - QtGui.QMessageBox.about( + QtWidgets.QMessageBox.about( self, _translate("MainWindow", "Address version number"), _translate( @@ -2169,7 +2172,7 @@ def click_pushButtonSend(self): ).format(toAddress, str(addressVersionNumber))) continue if streamNumber > 1 or streamNumber == 0: - QtGui.QMessageBox.about( + QtWidgets.QMessageBox.about( self, _translate("MainWindow", "Stream number"), _translate( @@ -2240,7 +2243,7 @@ def click_pushButtonSend(self): self.ui.comboBoxSendFromBroadcast.setCurrentIndex(0) self.ui.lineEditSubjectBroadcast.setText('') - self.ui.textEditMessageBroadcast.reset() + self.ui.textEditMessageBroadcast.clear() self.ui.tabWidget.setCurrentIndex( self.ui.tabWidget.indexOf(self.ui.send) ) @@ -2261,7 +2264,7 @@ def click_pushButtonLoadFromAddressBook(self): )) def click_pushButtonFetchNamecoinID(self): - identities = str(self.ui.lineEditTo.text().toUtf8()).split(";") + identities = self.ui.lineEditTo.text().split(";") err, addr = self.namecoin.query(identities[-1].strip()) if err is not None: self.updateStatusBar( @@ -2291,17 +2294,17 @@ def rerenderComboBoxSendFrom(self): addressInKeysFile, 'enabled') isMaillinglist = config.safeGetBoolean(addressInKeysFile, 'mailinglist') if isEnabled and not isMaillinglist: - label = str(config.get(addressInKeysFile, 'label'), 'utf-8', 'ignore').strip() + label = config.get(addressInKeysFile, 'label').strip() if label == "": label = addressInKeysFile self.ui.comboBoxSendFrom.addItem(avatarize(addressInKeysFile), label, addressInKeysFile) # self.ui.comboBoxSendFrom.model().sort(1, QtCore.Qt.SortOrder.AscendingOrder) for i in range(self.ui.comboBoxSendFrom.count()): - address = str(self.ui.comboBoxSendFrom.itemData( - i, QtCore.Qt.UserRole).toString()) + address = self.ui.comboBoxSendFrom.itemData( + i, QtCore.Qt.ItemDataRole.UserRole) self.ui.comboBoxSendFrom.setItemData( i, AccountColor(address).accountColor(), - QtCore.Qt.ForegroundRole) + QtCore.Qt.ItemDataRole.ForegroundRole) self.ui.comboBoxSendFrom.insertItem(0, '', '') if(self.ui.comboBoxSendFrom.count() == 2): self.ui.comboBoxSendFrom.setCurrentIndex(1) @@ -2315,16 +2318,16 @@ def rerenderComboBoxSendFromBroadcast(self): addressInKeysFile, 'enabled') isChan = config.safeGetBoolean(addressInKeysFile, 'chan') if isEnabled and not isChan: - label = str(config.get(addressInKeysFile, 'label'), 'utf-8', 'ignore').strip() + label = config.get(addressInKeysFile, 'label').strip() if label == "": label = addressInKeysFile self.ui.comboBoxSendFromBroadcast.addItem(avatarize(addressInKeysFile), label, addressInKeysFile) for i in range(self.ui.comboBoxSendFromBroadcast.count()): - address = str(self.ui.comboBoxSendFromBroadcast.itemData( - i, QtCore.Qt.UserRole).toString()) + address = self.ui.comboBoxSendFromBroadcast.itemData( + i, QtCore.Qt.ItemDataRole.UserRole) self.ui.comboBoxSendFromBroadcast.setItemData( i, AccountColor(address).accountColor(), - QtCore.Qt.ForegroundRole) + QtCore.Qt.ItemDataRole.ForegroundRole) self.ui.comboBoxSendFromBroadcast.insertItem(0, '', '') if(self.ui.comboBoxSendFromBroadcast.count() == 2): self.ui.comboBoxSendFromBroadcast.setCurrentIndex(1) @@ -2421,7 +2424,7 @@ def displayNewInboxMessage( self.notifierShow( _translate("MainWindow", "New Message"), _translate("MainWindow", "From {0}").format( - str(acct.fromLabel, 'utf-8')), + acct.fromLabel), sound.SOUND_UNKNOWN ) if self.getCurrentAccount() is not None and ( @@ -2436,7 +2439,7 @@ def displayNewInboxMessage( if acct.feedback != GatewayAccount.ALL_OK: if acct.feedback == GatewayAccount.REGISTRATION_DENIED: dialogs.EmailGatewayDialog( - self, config, acct).exec_() + self, config, acct).exec() # possible other branches? except AttributeError: pass @@ -2444,7 +2447,7 @@ def displayNewInboxMessage( def click_pushButtonAddAddressBook(self, dialog=None): if not dialog: dialog = dialogs.AddAddressDialog(self) - dialog.exec_() + dialog.exec() try: address, label = dialog.data except AttributeError: @@ -2489,7 +2492,7 @@ def addSubscription(self, address, label): def click_pushButtonAddSubscription(self): dialog = dialogs.NewSubscriptionDialog(self) - dialog.exec_() + dialog.exec() try: address, label = dialog.data except AttributeError: @@ -2518,19 +2521,19 @@ def click_pushButtonAddSubscription(self): )) def click_pushButtonStatusIcon(self): - dialogs.IconGlossaryDialog(self, config=config).exec_() + dialogs.IconGlossaryDialog(self, config=config).exec() def click_actionHelp(self): - dialogs.HelpDialog(self).exec_() + dialogs.HelpDialog(self).exec() def click_actionSupport(self): support.createSupportMessage(self) def click_actionAbout(self): - dialogs.AboutDialog(self).exec_() + dialogs.AboutDialog(self).exec() def click_actionSettings(self): - dialogs.SettingsDialog(self, firstrun=self._firstrun).exec_() + dialogs.SettingsDialog(self, firstrun=self._firstrun).exec() def on_action_Send(self): """Send message to current selected address""" @@ -2550,7 +2553,7 @@ def on_action_SpecialAddressBehaviorDialog(self): def on_action_EmailGatewayDialog(self): dialog = dialogs.EmailGatewayDialog(self, config=config) # For Modal dialogs - dialog.exec_() + dialog.exec() try: acct = dialog.data except AttributeError: @@ -2578,13 +2581,13 @@ def on_action_EmailGatewayDialog(self): self.ui.textEditMessage.setFocus() def on_action_MarkAllRead(self): - if QtGui.QMessageBox.question( + if QtWidgets.QMessageBox.question( self, "Marking all messages as read?", _translate( "MainWindow", "Are you sure you would like to mark all messages read?" - ), QtGui.QMessageBox.StandardButton.Yes | QtGui.QMessageBox.StandardButton.No - ) != QtGui.QMessageBox.StandardButton.Yes: + ), QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No + ) != QtWidgets.QMessageBox.StandardButton.Yes: return tableWidget = self.getCurrentMessagelist() @@ -2857,7 +2860,7 @@ def on_action_InboxMessageForceHtml(self): lines[i] = '

' content = ' '.join(lines) # To keep the whitespace between lines content = shared.fixPotentiallyInvalidUTF8Data(content) - content = str(content, 'utf-8)') + content = content textEdit.setHtml(QtCore.QString(content)) def on_action_InboxMarkUnread(self): @@ -3040,7 +3043,7 @@ def on_action_InboxReply(self, reply_type=None): self.setSendFromComboBox(toAddressAtCurrentInboxRow) quotedText = self.quoted_text( - str(messageAtCurrentInboxRow, 'utf-8', 'replace')) + messageAtCurrentInboxRow) widget['message'].setPlainText(quotedText) if acct.subject[0:3] in ('Re:', 'RE:'): widget['subject'].setText( @@ -3059,7 +3062,7 @@ def on_action_InboxAddSenderToAddressBook(self): return currentInboxRow = tableWidget.currentRow() addressAtCurrentInboxRow = tableWidget.item( - currentInboxRow, 1).data(QtCore.Qt.UserRole) + currentInboxRow, 1).data(QtCore.Qt.ItemDataRole.UserRole) self.ui.tabWidget.setCurrentIndex( self.ui.tabWidget.indexOf(self.ui.send) ) @@ -3072,9 +3075,9 @@ def on_action_InboxAddSenderToBlackList(self): return currentInboxRow = tableWidget.currentRow() addressAtCurrentInboxRow = tableWidget.item( - currentInboxRow, 1).data(QtCore.Qt.UserRole) + currentInboxRow, 1).data(QtCore.Qt.ItemDataRole.UserRole) recipientAddress = tableWidget.item( - currentInboxRow, 0).data(QtCore.Qt.UserRole) + currentInboxRow, 0).data(QtCore.Qt.ItemDataRole.UserRole) # Let's make sure that it isn't already in the address book queryreturn = sqlQuery('''select * from blacklist where address=?''', addressAtCurrentInboxRow) @@ -3186,7 +3189,7 @@ def on_action_InboxSaveMessageAs(self): currentInboxRow = tableWidget.currentRow() try: subjectAtCurrentInboxRow = str(tableWidget.item( - currentInboxRow, 2).data(QtCore.Qt.UserRole)) + currentInboxRow, 2).data(QtCore.Qt.ItemDataRole.UserRole)) except: subjectAtCurrentInboxRow = '' @@ -3240,7 +3243,7 @@ def on_action_SentTrash(self): def on_action_ForceSend(self): currentRow = self.ui.tableWidgetInbox.currentRow() addressAtCurrentRow = self.ui.tableWidgetInbox.item( - currentRow, 0).data(QtCore.Qt.UserRole) + currentRow, 0).data(QtCore.Qt.ItemDataRole.UserRole) toRipe = decodeAddress(addressAtCurrentRow)[3] sqlExecute( '''UPDATE sent SET status='forcepow' WHERE toripe=? AND status='toodifficult' and folder='sent' ''', @@ -3255,7 +3258,7 @@ def on_action_ForceSend(self): def on_action_SentClipboard(self): currentRow = self.ui.tableWidgetInbox.currentRow() addressAtCurrentRow = self.ui.tableWidgetInbox.item( - currentRow, 0).data(QtCore.Qt.UserRole) + currentRow, 0).data(QtCore.Qt.ItemDataRole.UserRole) clipboard = QtWidgets.QApplication.clipboard() clipboard.setText(str(addressAtCurrentRow)) @@ -3291,8 +3294,7 @@ def on_action_AddressBookSend(self): return self.updateStatusBar(_translate( "MainWindow", "No addresses selected.")) - addresses_string = str( - self.ui.lineEditTo.text().toUtf8(), 'utf-8') + addresses_string = self.ui.lineEditTo.text() for item in selected_items: address_string = item.accountString() if not addresses_string: @@ -3345,7 +3347,7 @@ def on_context_menuAddressBook(self, point): self.popMenuAddressBook.addSeparator() for plugin in self.menu_plugins['address']: self.popMenuAddressBook.addAction(plugin) - self.popMenuAddressBook.exec_( + self.popMenuAddressBook.exec( self.ui.tableWidgetAddressBook.mapToGlobal(point)) # Group of functions for the Subscriptions dialog box @@ -3426,7 +3428,7 @@ def on_context_menuSubscriptions(self, point): self.popMenuSubscriptions.addAction(self.actionMarkAllRead) if self.popMenuSubscriptions.isEmpty(): return - self.popMenuSubscriptions.exec_( + self.popMenuSubscriptions.exec( self.ui.treeWidgetSubscriptions.mapToGlobal(point)) def widgetConvert(self, widget): @@ -3532,7 +3534,7 @@ def getCurrentSearchLine(self, currentIndex=None, retObj=False): if currentIndex >= 0 and currentIndex < len(messagelistList): return ( messagelistList[currentIndex] if retObj - else messagelistList[currentIndex].text().toUtf8().data()) + else messagelistList[currentIndex].text()) def getCurrentSearchOption(self, currentIndex=None): if currentIndex is None: @@ -3653,18 +3655,18 @@ def on_action_ClipboardMessagelist(self): currentColumn = 0 if currentFolder == "sent" else 1 if currentFolder == "sent": - myAddress = tableWidget.item(currentRow, 1).data(QtCore.Qt.UserRole) - otherAddress = tableWidget.item(currentRow, 0).data(QtCore.Qt.UserRole) + myAddress = tableWidget.item(currentRow, 1).data(QtCore.Qt.ItemDataRole.UserRole) + otherAddress = tableWidget.item(currentRow, 0).data(QtCore.Qt.ItemDataRole.UserRole) else: - myAddress = tableWidget.item(currentRow, 0).data(QtCore.Qt.UserRole) - otherAddress = tableWidget.item(currentRow, 1).data(QtCore.Qt.UserRole) + myAddress = tableWidget.item(currentRow, 0).data(QtCore.Qt.ItemDataRole.UserRole) + otherAddress = tableWidget.item(currentRow, 1).data(QtCore.Qt.ItemDataRole.UserRole) account = accountClass(myAddress) if isinstance(account, GatewayAccount) and otherAddress == account.relayAddress and ( (currentColumn in [0, 2] and self.getCurrentFolder() == "sent") or (currentColumn in [1, 2] and self.getCurrentFolder() != "sent")): text = str(tableWidget.item(currentRow, currentColumn).label) else: - text = tableWidget.item(currentRow, currentColumn).data(QtCore.Qt.UserRole) + text = tableWidget.item(currentRow, currentColumn).data(QtCore.Qt.ItemDataRole.UserRole) clipboard = QtWidgets.QApplication.clipboard() clipboard.setText(text) @@ -3849,7 +3851,7 @@ def on_context_menuYourIdentities(self, point): self.popMenuYourIdentities.addAction(self.actionMarkAllRead) if self.popMenuYourIdentities.isEmpty(): return - self.popMenuYourIdentities.exec_( + self.popMenuYourIdentities.exec( self.ui.treeWidgetYourIdentities.mapToGlobal(point)) # TODO make one popMenu @@ -3878,7 +3880,7 @@ def on_context_menuChan(self, point): self.popMenu.addAction(self.actionMarkAllRead) if self.popMenu.isEmpty(): return - self.popMenu.exec_( + self.popMenu.exec( self.ui.treeWidgetChans.mapToGlobal(point)) def on_context_menuInbox(self, point): @@ -3897,7 +3899,7 @@ def on_context_menuInbox(self, point): self.popMenuInbox.addSeparator() currentRow = tableWidget.currentRow() account = accountClass( - tableWidget.item(currentRow, 0).data(QtCore.Qt.UserRole)) + tableWidget.item(currentRow, 0).data(QtCore.Qt.ItemDataRole.UserRole)) if account.type == AccountMixin.CHAN: self.popMenuInbox.addAction(self.actionReplyChan) @@ -3922,7 +3924,7 @@ def on_context_menuInbox(self, point): self.popMenuInbox.addAction(self.actionUndeleteTrashedMessage) else: self.popMenuInbox.addAction(self.actionTrashInboxMessage) - self.popMenuInbox.exec_(tableWidget.mapToGlobal(point)) + self.popMenuInbox.exec(tableWidget.mapToGlobal(point)) def on_context_menuSent(self, point): currentRow = self.ui.tableWidgetInbox.currentRow() @@ -3946,11 +3948,11 @@ def on_context_menuSent(self, point): if status == 'toodifficult': self.popMenuSent.addAction(self.actionForceSend) - self.popMenuSent.exec_(self.ui.tableWidgetInbox.mapToGlobal(point)) + self.popMenuSent.exec(self.ui.tableWidgetInbox.mapToGlobal(point)) def inboxSearchLineEditUpdated(self, text): # dynamic search for too short text is slow - text = text.toUtf8() + text = text if 0 < len(text) < 3: return messagelist = self.getCurrentMessagelist() @@ -4007,7 +4009,7 @@ def treeWidgetItemChanged(self, item, column): if item.type == AccountMixin.ALL: return - newLabel = str(item.text(0), 'utf-8', 'ignore') + newLabel = item.text(0) oldLabel = item.defaultLabel() # unchanged, do not do anything either diff --git a/src/bitmessageqt/account.py b/src/bitmessageqt/account.py index 25c86e46d3..fb21ec8dd0 100644 --- a/src/bitmessageqt/account.py +++ b/src/bitmessageqt/account.py @@ -150,10 +150,7 @@ def parseMessage(self, toAddress, fromAddress, subject, message): self.toAddress = toAddress self.fromAddress = fromAddress - if isinstance(subject, unicode): - self.subject = str(subject) - else: - self.subject = subject + self.subject = subject self.message = message self.fromLabel = self.getLabel(fromAddress) self.toLabel = self.getLabel(toAddress) diff --git a/src/bitmessageqt/address_dialogs.py b/src/bitmessageqt/address_dialogs.py index bee2779489..29bfc50a54 100644 --- a/src/bitmessageqt/address_dialogs.py +++ b/src/bitmessageqt/address_dialogs.py @@ -8,7 +8,7 @@ from PyQt6 import QtCore, QtGui, QtWidgets import queues -import bitmessageqt.widgets +import bitmessageqt.widgets as widgets import state from .account import AccountMixin, GatewayAccount, MailchuckAccount, accountClass from addresses import addBMIfNotPresent, decodeAddress, encodeVarint @@ -21,10 +21,6 @@ class AddressCheckMixin(object): def __init__(self): self.valid = False - QtCore.QObject.connect( # pylint: disable=no-member - self.lineEditAddress, - QtCore.SIGNAL("textChanged(QString)"), - self.addressChanged) def _onSuccess(self, addressVersion, streamNumber, ripe): pass @@ -90,8 +86,8 @@ def accept(self): """Callback for QDIalog accepting value""" if self.valid: self.data = ( - addBMIfNotPresent(str(self.lineEditAddress.text())), - str(self.lineEditLabel.text().toUtf8()) + addBMIfNotPresent(self.lineEditAddress.text()), + self.lineEditLabel.text() ) else: queues.UISignalQueue.put(('updateStatusBar', _translate( @@ -110,6 +106,7 @@ def __init__(self, parent=None, address=None): AddressCheckMixin.__init__(self) if address: self.lineEditAddress.setText(address) + self.lineEditAddress.textChanged.connect(self.addressChanged) class NewAddressDialog(QtWidgets.QDialog): @@ -125,7 +122,7 @@ def __init__(self, parent=None): self.radioButtonExisting.click() self.comboBoxExisting.addItem(address) self.groupBoxDeterministic.setHidden(True) - QtGui.QWidget.resize(self, QtGui.QWidget.sizeHint(self)) + QtWidgets.QWidget.resize(self, QtWidgets.QWidget.sizeHint(self)) self.show() def accept(self): @@ -142,7 +139,7 @@ def accept(self): self.comboBoxExisting.currentText())[2] queues.addressGeneratorQueue.put(( 'createRandomAddress', 4, streamNumberForAddress, - str(self.newaddresslabel.text().toUtf8()), 1, "", + self.newaddresslabel.text(), 1, "", self.checkBoxEighteenByteRipe.isChecked() )) else: @@ -169,7 +166,7 @@ def accept(self): 'createDeterministicAddresses', 4, streamNumberForAddress, "unused deterministic address", self.spinBoxNumberOfAddressesToMake.value(), - self.lineEditPassphrase.text().toUtf8(), + self.lineEditPassphrase.text(), self.checkBoxEighteenByteRipe.isChecked() )) @@ -181,6 +178,7 @@ def __init__(self, parent=None): super(NewSubscriptionDialog, self).__init__(parent) widgets.load('newsubscriptiondialog.ui', self) AddressCheckMixin.__init__(self) + self.lineEditAddress.textChanged.connect(self.addressChanged) def _onSuccess(self, addressVersion, streamNumber, ripe): if addressVersion <= 3: @@ -222,7 +220,7 @@ def __init__(self, parent=None): super(RegenerateAddressesDialog, self).__init__(parent) widgets.load('regenerateaddresses.ui', self) self.groupBox.setTitle('') - QtGui.QWidget.resize(self, QtGui.QWidget.sizeHint(self)) + QtWidgets.QWidget.resize(self, QtWidgets.QWidget.sizeHint(self)) class SpecialAddressBehaviorDialog(QtWidgets.QDialog): @@ -257,11 +255,9 @@ def __init__(self, parent=None, config=global_config): else: self.radioButtonBehaveNormalAddress.click() mailingListName = config.safeGet(self.address, 'mailinglistname', '') - self.lineEditMailingListName.setText( - unicode(mailingListName, 'utf-8') - ) + self.lineEditMailingListName.setText(mailingListName) - QtGui.QWidget.resize(self, QtGui.QWidget.sizeHint(self)) + QtWidgets.QWidget.resize(self, QtWidgets.QWidget.sizeHint(self)) self.show() def accept(self): @@ -281,7 +277,7 @@ def accept(self): else: self.config.set(str(self.address), 'mailinglist', 'true') self.config.set(str(self.address), 'mailinglistname', str( - self.lineEditMailingListName.text().toUtf8())) + self.lineEditMailingListName.text())) self.parent.setCurrentItemColor( QtGui.QColor(137, 4, 177)) # magenta self.parent.rerenderComboBoxSendFrom() @@ -329,7 +325,7 @@ def __init__(self, parent, config=global_config, account=None): else: self.acct = MailchuckAccount(address) self.lineEditEmail.setFocus() - QtGui.QWidget.resize(self, QtGui.QWidget.sizeHint(self)) + QtWidgets.QWidget.resize(self, QtWidgets.QWidget.sizeHint(self)) def accept(self): """Accept callback""" @@ -343,7 +339,7 @@ def accept(self): if self.radioButtonRegister.isChecked() \ or self.radioButtonRegister.isHidden(): - email = str(self.lineEditEmail.text().toUtf8()) + email = self.lineEditEmail.text() self.acct.register(email) self.config.set(self.acct.fromAddress, 'label', email) self.config.set(self.acct.fromAddress, 'gateway', 'mailchuck') diff --git a/src/bitmessageqt/addressvalidator.py b/src/bitmessageqt/addressvalidator.py index d1485b7b58..9785c3a2f8 100644 --- a/src/bitmessageqt/addressvalidator.py +++ b/src/bitmessageqt/addressvalidator.py @@ -5,7 +5,7 @@ from queue import Empty -from PyQt6 import QtGui +from PyQt6 import QtGui, QtWidgets from addresses import decodeAddress, addBMIfNotPresent from bmconfigparser import config @@ -32,7 +32,7 @@ def setParams( self.addressMandatory = addressMandatory self.isValid = False # save default text - self.okButtonLabel = self.buttonBox.button(QtGui.QDialogButtonBox.Ok).text() + self.okButtonLabel = self.buttonBox.button(QtWidgets.QDialogButtonBox.StandardButton.Ok).text() def setError(self, string): """Indicate that the validation is pending or failed""" @@ -44,12 +44,12 @@ def setError(self, string): self.feedBackObject.setText(string) self.isValid = False if self.buttonBox: - self.buttonBox.button(QtGui.QDialogButtonBox.Ok).setEnabled(False) + self.buttonBox.button(QtWidgets.QDialogButtonBox.StandardButton.Ok).setEnabled(False) if string is not None and self.feedBackObject is not None: - self.buttonBox.button(QtGui.QDialogButtonBox.Ok).setText( + self.buttonBox.button(QtWidgets.QDialogButtonBox.StandardButton.Ok).setText( _translate("AddressValidator", "Invalid")) else: - self.buttonBox.button(QtGui.QDialogButtonBox.Ok).setText( + self.buttonBox.button(QtWidgets.QDialogButtonBox.StandardButton.Ok).setText( _translate("AddressValidator", "Validating...")) def setOK(self, string): @@ -62,8 +62,8 @@ def setOK(self, string): self.feedBackObject.setText(string) self.isValid = True if self.buttonBox: - self.buttonBox.button(QtGui.QDialogButtonBox.Ok).setEnabled(True) - self.buttonBox.button(QtGui.QDialogButtonBox.Ok).setText(self.okButtonLabel) + self.buttonBox.button(QtWidgets.QDialogButtonBox.StandardButton.Ok).setEnabled(True) + self.buttonBox.button(QtWidgets.QDialogButtonBox.StandardButton.Ok).setText(self.okButtonLabel) def checkQueue(self): """Validator queue loop""" @@ -87,47 +87,47 @@ def checkQueue(self): if not addressGeneratorReturnValue: self.setError(_translate("AddressValidator", "Address already present as one of your identities.")) - return (QtGui.QValidator.Intermediate, 0) + return (QtGui.QValidator.State.Intermediate, 0) if addressGeneratorReturnValue[0] == 'chan name does not match address': self.setError( _translate( "AddressValidator", "Although the Bitmessage address you " "entered was valid, it doesn't match the chan name.")) - return (QtGui.QValidator.Intermediate, 0) + return (QtGui.QValidator.State.Intermediate, 0) self.setOK(_translate("MainWindow", "Passphrase and address appear to be valid.")) def returnValid(self): """Return the value of whether the validation was successful""" if self.isValid: - return QtGui.QValidator.Acceptable - return QtGui.QValidator.Intermediate + return QtGui.QValidator.State.Acceptable + return QtGui.QValidator.State.Intermediate def validate(self, s, pos): """Top level validator method""" if self.addressObject is None: address = None else: - address = str(self.addressObject.text().toUtf8()) + address = self.addressObject.text() if address == "": address = None if self.passPhraseObject is None: passPhrase = "" else: - passPhrase = str(self.passPhraseObject.text().toUtf8()) + passPhrase = self.passPhraseObject.text() if passPhrase == "": passPhrase = None # no chan name if passPhrase is None: self.setError(_translate("AddressValidator", "Chan name/passphrase needed. You didn't enter a chan name.")) - return (QtGui.QValidator.Intermediate, pos) + return (QtGui.QValidator.State.Intermediate, pos) if self.addressMandatory or address is not None: # check if address already exists: if address in config.addresses(): self.setError(_translate("AddressValidator", "Address already present as one of your identities.")) - return (QtGui.QValidator.Intermediate, pos) + return (QtGui.QValidator.State.Intermediate, pos) # version too high if decodeAddress(address)[0] == 'versiontoohigh': @@ -138,29 +138,29 @@ def validate(self, s, pos): " address might be valid, its version number" " is too new for us to handle. Perhaps you need" " to upgrade Bitmessage.")) - return (QtGui.QValidator.Intermediate, pos) + return (QtGui.QValidator.State.Intermediate, pos) # invalid if decodeAddress(address)[0] != 'success': self.setError(_translate("AddressValidator", "The Bitmessage address is not valid.")) - return (QtGui.QValidator.Intermediate, pos) + return (QtGui.QValidator.State.Intermediate, pos) # this just disables the OK button without changing the feedback text # but only if triggered by textEdited, not by clicking the Ok button - if not self.buttonBox.button(QtGui.QDialogButtonBox.Ok).hasFocus(): + if not self.buttonBox.button(QtWidgets.QDialogButtonBox.StandardButton.Ok).hasFocus(): self.setError(None) # check through generator if address is None: - addressGeneratorQueue.put(('createChan', 4, 1, str_chan + ' ' + str(passPhrase), passPhrase, False)) + addressGeneratorQueue.put(('createChan', 4, 1, str_chan + ' ' + passPhrase, passPhrase, False)) else: addressGeneratorQueue.put( ('joinChan', addBMIfNotPresent(address), "{} {}".format(str_chan, passPhrase), passPhrase, False)) - if self.buttonBox.button(QtGui.QDialogButtonBox.Ok).hasFocus(): + if self.buttonBox.button(QtWidgets.QDialogButtonBox.StandardButton.Ok).hasFocus(): return (self.returnValid(), pos) - return (QtGui.QValidator.Intermediate, pos) + return (QtGui.QValidator.State.Intermediate, pos) def checkData(self): """Validator Qt signal interface""" diff --git a/src/bitmessageqt/bitmessageui.py b/src/bitmessageqt/bitmessageui.py index 1e882928dc..139090b1b8 100644 --- a/src/bitmessageqt/bitmessageui.py +++ b/src/bitmessageqt/bitmessageui.py @@ -10,6 +10,7 @@ from bmconfigparser import config from .foldertree import AddressBookCompleter from .blacklist import Blacklist +import bitmessageqt.settingsmixin as settingsmixin from .networkstatus import NetworkStatus class Ui_MainWindow(object): @@ -164,41 +165,41 @@ def setupUi(self, MainWindow): self.verticalLayout.setObjectName("verticalLayout") self.tabWidgetSend = QtWidgets.QTabWidget(parent=self.send) self.tabWidgetSend.setObjectName("tabWidgetSend") - self.tab = QtWidgets.QWidget() - self.tab.setObjectName("tab") - self.gridLayout_8 = QtWidgets.QGridLayout(self.tab) + self.sendDirect = QtWidgets.QWidget() + self.sendDirect.setObjectName("sendDirect") + self.gridLayout_8 = QtWidgets.QGridLayout(self.sendDirect) self.gridLayout_8.setObjectName("gridLayout_8") self.verticalLayout_5 = QtWidgets.QVBoxLayout() self.verticalLayout_5.setObjectName("verticalLayout_5") self.gridLayout_2 = QtWidgets.QGridLayout() self.gridLayout_2.setObjectName("gridLayout_2") - self.label_3 = QtWidgets.QLabel(parent=self.tab) + self.label_3 = QtWidgets.QLabel(parent=self.sendDirect) self.label_3.setObjectName("label_3") self.gridLayout_2.addWidget(self.label_3, 2, 0, 1, 1) - self.label_2 = QtWidgets.QLabel(parent=self.tab) + self.label_2 = QtWidgets.QLabel(parent=self.sendDirect) self.label_2.setObjectName("label_2") self.gridLayout_2.addWidget(self.label_2, 0, 0, 1, 1) - self.lineEditSubject = QtWidgets.QLineEdit(parent=self.tab) + self.lineEditSubject = QtWidgets.QLineEdit(parent=self.sendDirect) self.lineEditSubject.setText("") self.lineEditSubject.setObjectName("lineEditSubject") self.gridLayout_2.addWidget(self.lineEditSubject, 2, 1, 1, 1) - self.label = QtWidgets.QLabel(parent=self.tab) + self.label = QtWidgets.QLabel(parent=self.sendDirect) self.label.setObjectName("label") self.gridLayout_2.addWidget(self.label, 1, 0, 1, 1) - self.comboBoxSendFrom = QtWidgets.QComboBox(parent=self.tab) + self.comboBoxSendFrom = QtWidgets.QComboBox(parent=self.sendDirect) self.comboBoxSendFrom.setMinimumSize(QtCore.QSize(300, 0)) self.comboBoxSendFrom.setObjectName("comboBoxSendFrom") self.gridLayout_2.addWidget(self.comboBoxSendFrom, 0, 1, 1, 1) - self.lineEditTo = QtWidgets.QLineEdit(parent=self.tab) + self.lineEditTo = QtWidgets.QLineEdit(parent=self.sendDirect) self.lineEditTo.setObjectName("lineEditTo") self.gridLayout_2.addWidget(self.lineEditTo, 1, 1, 1, 1) self.lineEditTo.setCompleter(self.addressBookCompleter) self.verticalLayout_5.addLayout(self.gridLayout_2) - self.textEditMessage = QtWidgets.QTextEdit(parent=self.tab) + self.textEditMessage = QtWidgets.QTextEdit(parent=self.sendDirect) self.textEditMessage.setObjectName("textEditMessage") self.verticalLayout_5.addWidget(self.textEditMessage) self.gridLayout_8.addLayout(self.verticalLayout_5, 0, 0, 1, 1) - self.tabWidgetSend.addTab(self.tab, "") + self.tabWidgetSend.addTab(self.sendDirect, "") self.tab_2 = QtWidgets.QWidget() self.tab_2.setObjectName("tab_2") self.gridLayout_9 = QtWidgets.QGridLayout(self.tab_2) @@ -360,15 +361,15 @@ def setupUi(self, MainWindow): icon6 = QtGui.QIcon() icon6.addPixmap(QtGui.QPixmap(":/newPrefix/images/subscriptions.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) self.tabWidget.addTab(self.subscriptions, icon6, "") - self.tab_3 = QtWidgets.QWidget() - self.tab_3.setObjectName("tab_3") - self.gridLayout_4 = QtWidgets.QGridLayout(self.tab_3) + self.chans = QtWidgets.QWidget() + self.chans.setObjectName("chans") + self.gridLayout_4 = QtWidgets.QGridLayout(self.chans) self.gridLayout_4.setObjectName("gridLayout_4") self.horizontalLayout_7 = QtWidgets.QHBoxLayout() self.horizontalLayout_7.setObjectName("horizontalLayout_7") self.verticalLayout_17 = QtWidgets.QVBoxLayout() self.verticalLayout_17.setObjectName("verticalLayout_17") - self.treeWidgetChans = QtWidgets.QTreeWidget(parent=self.tab_3) + self.treeWidgetChans = QtWidgets.QTreeWidget(parent=self.chans) self.treeWidgetChans.setMaximumSize(QtCore.QSize(200, 16777215)) self.treeWidgetChans.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) self.treeWidgetChans.setLineWidth(1) @@ -380,7 +381,7 @@ def setupUi(self, MainWindow): icon7.addPixmap(QtGui.QPixmap(":/newPrefix/images/can-icon-16px.png"), QtGui.QIcon.Mode.Selected, QtGui.QIcon.State.Off) self.treeWidgetChans.headerItem().setIcon(0, icon7) self.verticalLayout_17.addWidget(self.treeWidgetChans) - self.pushButtonAddChan = QtWidgets.QPushButton(parent=self.tab_3) + self.pushButtonAddChan = QtWidgets.QPushButton(parent=self.chans) self.pushButtonAddChan.setMaximumSize(QtCore.QSize(200, 16777215)) self.pushButtonAddChan.setObjectName("pushButtonAddChan") self.verticalLayout_17.addWidget(self.pushButtonAddChan) @@ -389,10 +390,10 @@ def setupUi(self, MainWindow): self.verticalLayout_8.setObjectName("verticalLayout_8") self.horizontalLayout_6 = QtWidgets.QHBoxLayout() self.horizontalLayout_6.setObjectName("horizontalLayout_6") - self.inboxSearchLineEditChans = QtWidgets.QLineEdit(parent=self.tab_3) + self.inboxSearchLineEditChans = QtWidgets.QLineEdit(parent=self.chans) self.inboxSearchLineEditChans.setObjectName("inboxSearchLineEditChans") self.horizontalLayout_6.addWidget(self.inboxSearchLineEditChans) - self.inboxSearchOptionChans = QtWidgets.QComboBox(parent=self.tab_3) + self.inboxSearchOptionChans = QtWidgets.QComboBox(parent=self.chans) self.inboxSearchOptionChans.setObjectName("inboxSearchOptionChans") self.inboxSearchOptionChans.addItem("") self.inboxSearchOptionChans.addItem("") @@ -401,7 +402,7 @@ def setupUi(self, MainWindow): self.inboxSearchOptionChans.addItem("") self.horizontalLayout_6.addWidget(self.inboxSearchOptionChans) self.verticalLayout_8.addLayout(self.horizontalLayout_6) - self.tableWidgetInboxChans = QtWidgets.QTableWidget(parent=self.tab_3) + self.tableWidgetInboxChans = QtWidgets.QTableWidget(parent=self.chans) self.tableWidgetInboxChans.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers) self.tableWidgetInboxChans.setAlternatingRowColors(True) self.tableWidgetInboxChans.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.ExtendedSelection) @@ -427,7 +428,7 @@ def setupUi(self, MainWindow): self.tableWidgetInboxChans.verticalHeader().setVisible(False) self.tableWidgetInboxChans.verticalHeader().setDefaultSectionSize(26) self.verticalLayout_8.addWidget(self.tableWidgetInboxChans) - self.textEditInboxMessageChans = QtWidgets.QTextEdit(parent=self.tab_3) + self.textEditInboxMessageChans = QtWidgets.QTextEdit(parent=self.chans) self.textEditInboxMessageChans.setBaseSize(QtCore.QSize(0, 500)) self.textEditInboxMessageChans.setReadOnly(True) self.textEditInboxMessageChans.setObjectName("textEditInboxMessageChans") @@ -436,7 +437,7 @@ def setupUi(self, MainWindow): self.gridLayout_4.addLayout(self.horizontalLayout_7, 0, 0, 1, 1) icon8 = QtGui.QIcon() icon8.addPixmap(QtGui.QPixmap(":/newPrefix/images/can-icon-16px.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.tabWidget.addTab(self.tab_3, icon8, "") + self.tabWidget.addTab(self.chans, icon8, "") self.blackwhitelist = Blacklist() self.blackwhitelist.setObjectName("blackwhitelist") self.tabWidget.addTab(self.blackwhitelist, QtGui.QIcon(":/newPrefix/images/blacklist.png"), "") @@ -445,108 +446,8 @@ def setupUi(self, MainWindow): self.blackwhitelist.radioButtonWhitelist.click() self.blackwhitelist.rerenderBlackWhiteList() - self.gridLayout_6 = QtWidgets.QGridLayout(self.blackwhitelist) - self.gridLayout_6.setObjectName("gridLayout_6") - self.radioButtonBlacklist = QtWidgets.QRadioButton(parent=self.blackwhitelist) - self.radioButtonBlacklist.setChecked(True) - self.radioButtonBlacklist.setObjectName("radioButtonBlacklist") - self.gridLayout_6.addWidget(self.radioButtonBlacklist, 0, 0, 1, 2) - self.radioButtonWhitelist = QtWidgets.QRadioButton(parent=self.blackwhitelist) - self.radioButtonWhitelist.setObjectName("radioButtonWhitelist") - self.gridLayout_6.addWidget(self.radioButtonWhitelist, 1, 0, 1, 2) - self.pushButtonAddBlacklist = QtWidgets.QPushButton(parent=self.blackwhitelist) - self.pushButtonAddBlacklist.setObjectName("pushButtonAddBlacklist") - self.gridLayout_6.addWidget(self.pushButtonAddBlacklist, 2, 0, 1, 1) - spacerItem = QtWidgets.QSpacerItem(689, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) - self.gridLayout_6.addItem(spacerItem, 2, 1, 1, 1) - self.tableWidgetBlacklist = QtWidgets.QTableWidget(parent=self.blackwhitelist) - self.tableWidgetBlacklist.setAlternatingRowColors(True) - self.tableWidgetBlacklist.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.SingleSelection) - self.tableWidgetBlacklist.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows) - self.tableWidgetBlacklist.setObjectName("tableWidgetBlacklist") - self.tableWidgetBlacklist.setColumnCount(2) - self.tableWidgetBlacklist.setRowCount(0) - item = QtWidgets.QTableWidgetItem() - self.tableWidgetBlacklist.setHorizontalHeaderItem(0, item) - item = QtWidgets.QTableWidgetItem() - self.tableWidgetBlacklist.setHorizontalHeaderItem(1, item) - self.tableWidgetBlacklist.horizontalHeader().setCascadingSectionResizes(True) - self.tableWidgetBlacklist.horizontalHeader().setDefaultSectionSize(400) - self.tableWidgetBlacklist.horizontalHeader().setHighlightSections(False) - self.tableWidgetBlacklist.horizontalHeader().setSortIndicatorShown(False) - self.tableWidgetBlacklist.horizontalHeader().setStretchLastSection(True) - self.tableWidgetBlacklist.verticalHeader().setVisible(False) - self.gridLayout_6.addWidget(self.tableWidgetBlacklist, 3, 0, 1, 2) - icon9 = QtGui.QIcon() - icon9.addPixmap(QtGui.QPixmap(":/newPrefix/images/blacklist.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.tabWidget.addTab(self.blackwhitelist, icon9, "") self.networkstatus = NetworkStatus() self.tabWidget.addTab(self.networkstatus, QtGui.QIcon(":/newPrefix/images/networkstatus.png"), "") - self.networkstatus.setObjectName("networkstatus") - self.pushButtonStatusIcon = QtWidgets.QPushButton(parent=self.networkstatus) - self.pushButtonStatusIcon.setGeometry(QtCore.QRect(680, 440, 21, 23)) - self.pushButtonStatusIcon.setText("") - icon10 = QtGui.QIcon() - icon10.addPixmap(QtGui.QPixmap(":/newPrefix/images/redicon.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.pushButtonStatusIcon.setIcon(icon10) - self.pushButtonStatusIcon.setFlat(True) - self.pushButtonStatusIcon.setObjectName("pushButtonStatusIcon") - self.tableWidgetConnectionCount = QtWidgets.QTableWidget(parent=self.networkstatus) - self.tableWidgetConnectionCount.setGeometry(QtCore.QRect(20, 70, 241, 241)) - palette = QtGui.QPalette() - brush = QtGui.QBrush(QtGui.QColor(212, 208, 200)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush(QtGui.QPalette.ColorGroup.Active, QtGui.QPalette.ColorRole.Base, brush) - brush = QtGui.QBrush(QtGui.QColor(212, 208, 200)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush(QtGui.QPalette.ColorGroup.Inactive, QtGui.QPalette.ColorRole.Base, brush) - brush = QtGui.QBrush(QtGui.QColor(212, 208, 200)) - brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) - palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.Base, brush) - self.tableWidgetConnectionCount.setPalette(palette) - self.tableWidgetConnectionCount.setFrameShape(QtWidgets.QFrame.Shape.Box) - self.tableWidgetConnectionCount.setFrameShadow(QtWidgets.QFrame.Shadow.Plain) - self.tableWidgetConnectionCount.setProperty("showDropIndicator", False) - self.tableWidgetConnectionCount.setAlternatingRowColors(True) - self.tableWidgetConnectionCount.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.NoSelection) - self.tableWidgetConnectionCount.setObjectName("tableWidgetConnectionCount") - self.tableWidgetConnectionCount.setColumnCount(2) - self.tableWidgetConnectionCount.setRowCount(0) - item = QtWidgets.QTableWidgetItem() - self.tableWidgetConnectionCount.setHorizontalHeaderItem(0, item) - item = QtWidgets.QTableWidgetItem() - self.tableWidgetConnectionCount.setHorizontalHeaderItem(1, item) - self.tableWidgetConnectionCount.horizontalHeader().setCascadingSectionResizes(True) - self.tableWidgetConnectionCount.horizontalHeader().setHighlightSections(False) - self.tableWidgetConnectionCount.horizontalHeader().setStretchLastSection(True) - self.tableWidgetConnectionCount.verticalHeader().setVisible(False) - self.labelTotalConnections = QtWidgets.QLabel(parent=self.networkstatus) - self.labelTotalConnections.setGeometry(QtCore.QRect(20, 30, 401, 16)) - self.labelTotalConnections.setObjectName("labelTotalConnections") - self.labelStartupTime = QtWidgets.QLabel(parent=self.networkstatus) - self.labelStartupTime.setGeometry(QtCore.QRect(320, 110, 331, 20)) - self.labelStartupTime.setObjectName("labelStartupTime") - self.labelMessageCount = QtWidgets.QLabel(parent=self.networkstatus) - self.labelMessageCount.setGeometry(QtCore.QRect(350, 130, 361, 16)) - self.labelMessageCount.setObjectName("labelMessageCount") - self.labelPubkeyCount = QtWidgets.QLabel(parent=self.networkstatus) - self.labelPubkeyCount.setGeometry(QtCore.QRect(350, 170, 331, 16)) - self.labelPubkeyCount.setObjectName("labelPubkeyCount") - self.labelBroadcastCount = QtWidgets.QLabel(parent=self.networkstatus) - self.labelBroadcastCount.setGeometry(QtCore.QRect(350, 150, 351, 16)) - self.labelBroadcastCount.setObjectName("labelBroadcastCount") - self.labelLookupsPerSecond = QtWidgets.QLabel(parent=self.networkstatus) - self.labelLookupsPerSecond.setGeometry(QtCore.QRect(320, 250, 291, 16)) - self.labelLookupsPerSecond.setObjectName("labelLookupsPerSecond") - self.labelBytesRecvCount = QtWidgets.QLabel(parent=self.networkstatus) - self.labelBytesRecvCount.setGeometry(QtCore.QRect(350, 210, 251, 16)) - self.labelBytesRecvCount.setObjectName("labelBytesRecvCount") - self.labelBytesSentCount = QtWidgets.QLabel(parent=self.networkstatus) - self.labelBytesSentCount.setGeometry(QtCore.QRect(350, 230, 251, 16)) - self.labelBytesSentCount.setObjectName("labelBytesSentCount") - icon11 = QtGui.QIcon() - icon11.addPixmap(QtGui.QPixmap(":/newPrefix/images/networkstatus.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.tabWidget.addTab(self.networkstatus, icon11, "") self.gridLayout_10.addWidget(self.tabWidget, 0, 0, 1, 1) self.MainDock.setWidget(self.centralwidget) MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea.AllDockWidgetAreas, self.MainDock) @@ -620,8 +521,12 @@ def setupUi(self, MainWindow): self.menubar.addAction(self.menuHelp.menuAction()) self.retranslateUi(MainWindow) - self.tabWidget.setCurrentIndex(0) - self.tabWidgetSend.setCurrentIndex(0) + self.tabWidget.setCurrentIndex( + self.tabWidget.indexOf(self.inbox) + ) + self.tabWidgetSend.setCurrentIndex( + self.tabWidgetSend.indexOf(self.sendDirect) + ) QtCore.QMetaObject.connectSlotsByName(MainWindow) MainWindow.setTabOrder(self.tableWidgetInbox, self.textEditInboxMessage) MainWindow.setTabOrder(self.textEditInboxMessage, self.comboBoxSendFrom) @@ -630,12 +535,6 @@ def setupUi(self, MainWindow): MainWindow.setTabOrder(self.lineEditSubject, self.textEditMessage) MainWindow.setTabOrder(self.textEditMessage, self.pushButtonSend) MainWindow.setTabOrder(self.pushButtonSend, self.pushButtonAddSubscription) - MainWindow.setTabOrder(self.pushButtonAddSubscription, self.radioButtonBlacklist) - MainWindow.setTabOrder(self.radioButtonBlacklist, self.radioButtonWhitelist) - MainWindow.setTabOrder(self.radioButtonWhitelist, self.pushButtonAddBlacklist) - MainWindow.setTabOrder(self.pushButtonAddBlacklist, self.tableWidgetBlacklist) - MainWindow.setTabOrder(self.tableWidgetBlacklist, self.tableWidgetConnectionCount) - MainWindow.setTabOrder(self.tableWidgetConnectionCount, self.pushButtonStatusIcon) # Popup menu actions container for the Sent page # pylint: disable=attribute-defined-outside-init @@ -693,7 +592,7 @@ def retranslateUi(self, MainWindow): "p, li { white-space: pre-wrap; }\n" "\n" "


")) - self.tabWidgetSend.setTabText(self.tabWidgetSend.indexOf(self.tab), _translate("MainWindow", "Send ordinary Message")) + self.tabWidgetSend.setTabText(self.tabWidgetSend.indexOf(self.sendDirect), _translate("MainWindow", "Send ordinary Message")) self.label_8.setText(_translate("MainWindow", "From:")) self.label_7.setText(_translate("MainWindow", "Subject:")) self.textEditMessageBroadcast.setHtml(_translate("MainWindow", "\n" @@ -703,7 +602,6 @@ def retranslateUi(self, MainWindow): "


")) self.tabWidgetSend.setTabText(self.tabWidgetSend.indexOf(self.tab_2), _translate("MainWindow", "Send Message to your Subscribers")) self.pushButtonTTL.setText(_translate("MainWindow", "TTL:")) - self.labelHumanFriendlyTTLDescription.setText(_translate("MainWindow", "X days")) self.pushButtonClear.setText(_translate("MainWindow", "Clear")) self.pushButtonSend.setText(_translate("MainWindow", "Send")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.send), _translate("MainWindow", "Send")) @@ -742,32 +640,9 @@ def retranslateUi(self, MainWindow): item.setText(_translate("MainWindow", "Subject")) item = self.tableWidgetInboxChans.horizontalHeaderItem(3) item.setText(_translate("MainWindow", "Received")) - self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), _translate("MainWindow", "Chans")) - self.radioButtonBlacklist.setText(_translate("MainWindow", "Use a Blacklist (Allow all incoming messages except those on the Blacklist)")) - self.radioButtonWhitelist.setText(_translate("MainWindow", "Use a Whitelist (Block all incoming messages except those on the Whitelist)")) - self.pushButtonAddBlacklist.setText(_translate("MainWindow", "Add new entry")) - self.tableWidgetBlacklist.setSortingEnabled(True) - item = self.tableWidgetBlacklist.horizontalHeaderItem(0) - item.setText(_translate("MainWindow", "Name or Label")) - item = self.tableWidgetBlacklist.horizontalHeaderItem(1) - item.setText(_translate("MainWindow", "Address")) - self.blackwhitelist.retranslateUi() - self.tabWidget.setTabText(self.tabWidget.indexOf(self.blackwhitelist), _translate("MainWindow", "Blacklist")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.chans), _translate("MainWindow", "Chans")) self.networkstatus.retranslateUi() self.tabWidget.setTabText(self.tabWidget.indexOf(self.networkstatus), _translate("MainWindow", "Network Status")) - item = self.tableWidgetConnectionCount.horizontalHeaderItem(0) - item.setText(_translate("MainWindow", "Stream #")) - item = self.tableWidgetConnectionCount.horizontalHeaderItem(1) - item.setText(_translate("MainWindow", "Connections")) - self.labelTotalConnections.setText(_translate("MainWindow", "Total connections:")) - self.labelStartupTime.setText(_translate("MainWindow", "Since startup:")) - self.labelMessageCount.setText(_translate("MainWindow", "Processed 0 person-to-person messages.")) - self.labelPubkeyCount.setText(_translate("MainWindow", "Processed 0 public keys.")) - self.labelBroadcastCount.setText(_translate("MainWindow", "Processed 0 broadcasts.")) - self.labelLookupsPerSecond.setText(_translate("MainWindow", "Inventory lookups per second: 0")) - self.labelBytesRecvCount.setText(_translate("MainWindow", "Down: 0 KB/s")) - self.labelBytesSentCount.setText(_translate("MainWindow", "Up: 0 KB/s")) - self.tabWidget.setTabText(self.tabWidget.indexOf(self.networkstatus), _translate("MainWindow", "Network Status")) self.menuFile.setTitle(_translate("MainWindow", "File")) self.menuSettings.setTitle(_translate("MainWindow", "Settings")) self.menuHelp.setTitle(_translate("MainWindow", "Help")) diff --git a/src/bitmessageqt/bitmessageui.py.diff b/src/bitmessageqt/bitmessageui.py.diff index 989e82251d..abb13228fc 100644 --- a/src/bitmessageqt/bitmessageui.py.diff +++ b/src/bitmessageqt/bitmessageui.py.diff @@ -1,6 +1,6 @@ --- bitmessageui.py.orig 2024-05-13 08:32:22.376971328 +0900 -+++ bitmessageui.py 2024-05-13 09:48:39.354481762 +0900 -@@ -7,7 +7,10 @@ ++++ bitmessageui.py 2024-05-14 15:56:24.921713575 +0900 +@@ -7,7 +7,11 @@ from PyQt6 import QtCore, QtGui, QtWidgets @@ -8,11 +8,12 @@ +from bmconfigparser import config +from .foldertree import AddressBookCompleter +from .blacklist import Blacklist ++import bitmessageqt.settingsmixin as settingsmixin +from .networkstatus import NetworkStatus class Ui_MainWindow(object): def setupUi(self, MainWindow): -@@ -140,6 +143,11 @@ +@@ -140,6 +144,11 @@ self.tableWidgetAddressBook.horizontalHeader().setStretchLastSection(True) self.tableWidgetAddressBook.verticalHeader().setVisible(False) self.verticalLayout_2.addWidget(self.tableWidgetAddressBook) @@ -24,15 +25,60 @@ self.pushButtonAddAddressBook = QtWidgets.QPushButton(parent=self.send) self.pushButtonAddAddressBook.setMaximumSize(QtCore.QSize(200, 16777215)) self.pushButtonAddAddressBook.setObjectName("pushButtonAddAddressBook") -@@ -184,6 +192,7 @@ - self.lineEditTo = QtWidgets.QLineEdit(parent=self.tab) +@@ -156,40 +165,41 @@ + self.verticalLayout.setObjectName("verticalLayout") + self.tabWidgetSend = QtWidgets.QTabWidget(parent=self.send) + self.tabWidgetSend.setObjectName("tabWidgetSend") +- self.tab = QtWidgets.QWidget() +- self.tab.setObjectName("tab") +- self.gridLayout_8 = QtWidgets.QGridLayout(self.tab) ++ self.sendDirect = QtWidgets.QWidget() ++ self.sendDirect.setObjectName("sendDirect") ++ self.gridLayout_8 = QtWidgets.QGridLayout(self.sendDirect) + self.gridLayout_8.setObjectName("gridLayout_8") + self.verticalLayout_5 = QtWidgets.QVBoxLayout() + self.verticalLayout_5.setObjectName("verticalLayout_5") + self.gridLayout_2 = QtWidgets.QGridLayout() + self.gridLayout_2.setObjectName("gridLayout_2") +- self.label_3 = QtWidgets.QLabel(parent=self.tab) ++ self.label_3 = QtWidgets.QLabel(parent=self.sendDirect) + self.label_3.setObjectName("label_3") + self.gridLayout_2.addWidget(self.label_3, 2, 0, 1, 1) +- self.label_2 = QtWidgets.QLabel(parent=self.tab) ++ self.label_2 = QtWidgets.QLabel(parent=self.sendDirect) + self.label_2.setObjectName("label_2") + self.gridLayout_2.addWidget(self.label_2, 0, 0, 1, 1) +- self.lineEditSubject = QtWidgets.QLineEdit(parent=self.tab) ++ self.lineEditSubject = QtWidgets.QLineEdit(parent=self.sendDirect) + self.lineEditSubject.setText("") + self.lineEditSubject.setObjectName("lineEditSubject") + self.gridLayout_2.addWidget(self.lineEditSubject, 2, 1, 1, 1) +- self.label = QtWidgets.QLabel(parent=self.tab) ++ self.label = QtWidgets.QLabel(parent=self.sendDirect) + self.label.setObjectName("label") + self.gridLayout_2.addWidget(self.label, 1, 0, 1, 1) +- self.comboBoxSendFrom = QtWidgets.QComboBox(parent=self.tab) ++ self.comboBoxSendFrom = QtWidgets.QComboBox(parent=self.sendDirect) + self.comboBoxSendFrom.setMinimumSize(QtCore.QSize(300, 0)) + self.comboBoxSendFrom.setObjectName("comboBoxSendFrom") + self.gridLayout_2.addWidget(self.comboBoxSendFrom, 0, 1, 1, 1) +- self.lineEditTo = QtWidgets.QLineEdit(parent=self.tab) ++ self.lineEditTo = QtWidgets.QLineEdit(parent=self.sendDirect) self.lineEditTo.setObjectName("lineEditTo") self.gridLayout_2.addWidget(self.lineEditTo, 1, 1, 1, 1) + self.lineEditTo.setCompleter(self.addressBookCompleter) self.verticalLayout_5.addLayout(self.gridLayout_2) - self.textEditMessage = QtWidgets.QTextEdit(parent=self.tab) +- self.textEditMessage = QtWidgets.QTextEdit(parent=self.tab) ++ self.textEditMessage = QtWidgets.QTextEdit(parent=self.sendDirect) self.textEditMessage.setObjectName("textEditMessage") -@@ -263,6 +272,9 @@ + self.verticalLayout_5.addWidget(self.textEditMessage) + self.gridLayout_8.addLayout(self.verticalLayout_5, 0, 0, 1, 1) +- self.tabWidgetSend.addTab(self.tab, "") ++ self.tabWidgetSend.addTab(self.sendDirect, "") + self.tab_2 = QtWidgets.QWidget() + self.tab_2.setObjectName("tab_2") + self.gridLayout_9 = QtWidgets.QGridLayout(self.tab_2) +@@ -263,6 +273,9 @@ self.labelHumanFriendlyTTLDescription.setMaximumSize(QtCore.QSize(45, 16777215)) self.labelHumanFriendlyTTLDescription.setObjectName("labelHumanFriendlyTTLDescription") self.horizontalLayout_5.addWidget(self.labelHumanFriendlyTTLDescription) @@ -42,34 +88,184 @@ self.pushButtonSend = QtWidgets.QPushButton(parent=self.send) self.pushButtonSend.setMaximumSize(QtCore.QSize(16777215, 16777215)) self.pushButtonSend.setObjectName("pushButtonSend") -@@ -425,8 +437,14 @@ +@@ -348,15 +361,15 @@ + icon6 = QtGui.QIcon() + icon6.addPixmap(QtGui.QPixmap(":/newPrefix/images/subscriptions.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + self.tabWidget.addTab(self.subscriptions, icon6, "") +- self.tab_3 = QtWidgets.QWidget() +- self.tab_3.setObjectName("tab_3") +- self.gridLayout_4 = QtWidgets.QGridLayout(self.tab_3) ++ self.chans = QtWidgets.QWidget() ++ self.chans.setObjectName("chans") ++ self.gridLayout_4 = QtWidgets.QGridLayout(self.chans) + self.gridLayout_4.setObjectName("gridLayout_4") + self.horizontalLayout_7 = QtWidgets.QHBoxLayout() + self.horizontalLayout_7.setObjectName("horizontalLayout_7") + self.verticalLayout_17 = QtWidgets.QVBoxLayout() + self.verticalLayout_17.setObjectName("verticalLayout_17") +- self.treeWidgetChans = QtWidgets.QTreeWidget(parent=self.tab_3) ++ self.treeWidgetChans = QtWidgets.QTreeWidget(parent=self.chans) + self.treeWidgetChans.setMaximumSize(QtCore.QSize(200, 16777215)) + self.treeWidgetChans.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + self.treeWidgetChans.setLineWidth(1) +@@ -368,7 +381,7 @@ + icon7.addPixmap(QtGui.QPixmap(":/newPrefix/images/can-icon-16px.png"), QtGui.QIcon.Mode.Selected, QtGui.QIcon.State.Off) + self.treeWidgetChans.headerItem().setIcon(0, icon7) + self.verticalLayout_17.addWidget(self.treeWidgetChans) +- self.pushButtonAddChan = QtWidgets.QPushButton(parent=self.tab_3) ++ self.pushButtonAddChan = QtWidgets.QPushButton(parent=self.chans) + self.pushButtonAddChan.setMaximumSize(QtCore.QSize(200, 16777215)) + self.pushButtonAddChan.setObjectName("pushButtonAddChan") + self.verticalLayout_17.addWidget(self.pushButtonAddChan) +@@ -377,10 +390,10 @@ + self.verticalLayout_8.setObjectName("verticalLayout_8") + self.horizontalLayout_6 = QtWidgets.QHBoxLayout() + self.horizontalLayout_6.setObjectName("horizontalLayout_6") +- self.inboxSearchLineEditChans = QtWidgets.QLineEdit(parent=self.tab_3) ++ self.inboxSearchLineEditChans = QtWidgets.QLineEdit(parent=self.chans) + self.inboxSearchLineEditChans.setObjectName("inboxSearchLineEditChans") + self.horizontalLayout_6.addWidget(self.inboxSearchLineEditChans) +- self.inboxSearchOptionChans = QtWidgets.QComboBox(parent=self.tab_3) ++ self.inboxSearchOptionChans = QtWidgets.QComboBox(parent=self.chans) + self.inboxSearchOptionChans.setObjectName("inboxSearchOptionChans") + self.inboxSearchOptionChans.addItem("") + self.inboxSearchOptionChans.addItem("") +@@ -389,7 +402,7 @@ + self.inboxSearchOptionChans.addItem("") + self.horizontalLayout_6.addWidget(self.inboxSearchOptionChans) + self.verticalLayout_8.addLayout(self.horizontalLayout_6) +- self.tableWidgetInboxChans = QtWidgets.QTableWidget(parent=self.tab_3) ++ self.tableWidgetInboxChans = QtWidgets.QTableWidget(parent=self.chans) + self.tableWidgetInboxChans.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers) + self.tableWidgetInboxChans.setAlternatingRowColors(True) + self.tableWidgetInboxChans.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.ExtendedSelection) +@@ -415,7 +428,7 @@ + self.tableWidgetInboxChans.verticalHeader().setVisible(False) + self.tableWidgetInboxChans.verticalHeader().setDefaultSectionSize(26) + self.verticalLayout_8.addWidget(self.tableWidgetInboxChans) +- self.textEditInboxMessageChans = QtWidgets.QTextEdit(parent=self.tab_3) ++ self.textEditInboxMessageChans = QtWidgets.QTextEdit(parent=self.chans) + self.textEditInboxMessageChans.setBaseSize(QtCore.QSize(0, 500)) + self.textEditInboxMessageChans.setReadOnly(True) + self.textEditInboxMessageChans.setObjectName("textEditInboxMessageChans") +@@ -424,113 +437,20 @@ + self.gridLayout_4.addLayout(self.horizontalLayout_7, 0, 0, 1, 1) icon8 = QtGui.QIcon() icon8.addPixmap(QtGui.QPixmap(":/newPrefix/images/can-icon-16px.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.tabWidget.addTab(self.tab_3, icon8, "") +- self.tabWidget.addTab(self.tab_3, icon8, "") - self.blackwhitelist = QtWidgets.QWidget() ++ self.tabWidget.addTab(self.chans, icon8, "") + self.blackwhitelist = Blacklist() self.blackwhitelist.setObjectName("blackwhitelist") +- self.gridLayout_6 = QtWidgets.QGridLayout(self.blackwhitelist) +- self.gridLayout_6.setObjectName("gridLayout_6") +- self.radioButtonBlacklist = QtWidgets.QRadioButton(parent=self.blackwhitelist) +- self.radioButtonBlacklist.setChecked(True) +- self.radioButtonBlacklist.setObjectName("radioButtonBlacklist") +- self.gridLayout_6.addWidget(self.radioButtonBlacklist, 0, 0, 1, 2) +- self.radioButtonWhitelist = QtWidgets.QRadioButton(parent=self.blackwhitelist) +- self.radioButtonWhitelist.setObjectName("radioButtonWhitelist") +- self.gridLayout_6.addWidget(self.radioButtonWhitelist, 1, 0, 1, 2) +- self.pushButtonAddBlacklist = QtWidgets.QPushButton(parent=self.blackwhitelist) +- self.pushButtonAddBlacklist.setObjectName("pushButtonAddBlacklist") +- self.gridLayout_6.addWidget(self.pushButtonAddBlacklist, 2, 0, 1, 1) +- spacerItem = QtWidgets.QSpacerItem(689, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) +- self.gridLayout_6.addItem(spacerItem, 2, 1, 1, 1) +- self.tableWidgetBlacklist = QtWidgets.QTableWidget(parent=self.blackwhitelist) +- self.tableWidgetBlacklist.setAlternatingRowColors(True) +- self.tableWidgetBlacklist.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.SingleSelection) +- self.tableWidgetBlacklist.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows) +- self.tableWidgetBlacklist.setObjectName("tableWidgetBlacklist") +- self.tableWidgetBlacklist.setColumnCount(2) +- self.tableWidgetBlacklist.setRowCount(0) +- item = QtWidgets.QTableWidgetItem() +- self.tableWidgetBlacklist.setHorizontalHeaderItem(0, item) +- item = QtWidgets.QTableWidgetItem() +- self.tableWidgetBlacklist.setHorizontalHeaderItem(1, item) +- self.tableWidgetBlacklist.horizontalHeader().setCascadingSectionResizes(True) +- self.tableWidgetBlacklist.horizontalHeader().setDefaultSectionSize(400) +- self.tableWidgetBlacklist.horizontalHeader().setHighlightSections(False) +- self.tableWidgetBlacklist.horizontalHeader().setSortIndicatorShown(False) +- self.tableWidgetBlacklist.horizontalHeader().setStretchLastSection(True) +- self.tableWidgetBlacklist.verticalHeader().setVisible(False) +- self.gridLayout_6.addWidget(self.tableWidgetBlacklist, 3, 0, 1, 2) +- icon9 = QtGui.QIcon() +- icon9.addPixmap(QtGui.QPixmap(":/newPrefix/images/blacklist.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) +- self.tabWidget.addTab(self.blackwhitelist, icon9, "") +- self.networkstatus = QtWidgets.QWidget() +- self.networkstatus.setObjectName("networkstatus") +- self.pushButtonStatusIcon = QtWidgets.QPushButton(parent=self.networkstatus) +- self.pushButtonStatusIcon.setGeometry(QtCore.QRect(680, 440, 21, 23)) +- self.pushButtonStatusIcon.setText("") +- icon10 = QtGui.QIcon() +- icon10.addPixmap(QtGui.QPixmap(":/newPrefix/images/redicon.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) +- self.pushButtonStatusIcon.setIcon(icon10) +- self.pushButtonStatusIcon.setFlat(True) +- self.pushButtonStatusIcon.setObjectName("pushButtonStatusIcon") +- self.tableWidgetConnectionCount = QtWidgets.QTableWidget(parent=self.networkstatus) +- self.tableWidgetConnectionCount.setGeometry(QtCore.QRect(20, 70, 241, 241)) +- palette = QtGui.QPalette() +- brush = QtGui.QBrush(QtGui.QColor(212, 208, 200)) +- brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) +- palette.setBrush(QtGui.QPalette.ColorGroup.Active, QtGui.QPalette.ColorRole.Base, brush) +- brush = QtGui.QBrush(QtGui.QColor(212, 208, 200)) +- brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) +- palette.setBrush(QtGui.QPalette.ColorGroup.Inactive, QtGui.QPalette.ColorRole.Base, brush) +- brush = QtGui.QBrush(QtGui.QColor(212, 208, 200)) +- brush.setStyle(QtCore.Qt.BrushStyle.SolidPattern) +- palette.setBrush(QtGui.QPalette.ColorGroup.Disabled, QtGui.QPalette.ColorRole.Base, brush) +- self.tableWidgetConnectionCount.setPalette(palette) +- self.tableWidgetConnectionCount.setFrameShape(QtWidgets.QFrame.Shape.Box) +- self.tableWidgetConnectionCount.setFrameShadow(QtWidgets.QFrame.Shadow.Plain) +- self.tableWidgetConnectionCount.setProperty("showDropIndicator", False) +- self.tableWidgetConnectionCount.setAlternatingRowColors(True) +- self.tableWidgetConnectionCount.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.NoSelection) +- self.tableWidgetConnectionCount.setObjectName("tableWidgetConnectionCount") +- self.tableWidgetConnectionCount.setColumnCount(2) +- self.tableWidgetConnectionCount.setRowCount(0) +- item = QtWidgets.QTableWidgetItem() +- self.tableWidgetConnectionCount.setHorizontalHeaderItem(0, item) +- item = QtWidgets.QTableWidgetItem() +- self.tableWidgetConnectionCount.setHorizontalHeaderItem(1, item) +- self.tableWidgetConnectionCount.horizontalHeader().setCascadingSectionResizes(True) +- self.tableWidgetConnectionCount.horizontalHeader().setHighlightSections(False) +- self.tableWidgetConnectionCount.horizontalHeader().setStretchLastSection(True) +- self.tableWidgetConnectionCount.verticalHeader().setVisible(False) +- self.labelTotalConnections = QtWidgets.QLabel(parent=self.networkstatus) +- self.labelTotalConnections.setGeometry(QtCore.QRect(20, 30, 401, 16)) +- self.labelTotalConnections.setObjectName("labelTotalConnections") +- self.labelStartupTime = QtWidgets.QLabel(parent=self.networkstatus) +- self.labelStartupTime.setGeometry(QtCore.QRect(320, 110, 331, 20)) +- self.labelStartupTime.setObjectName("labelStartupTime") +- self.labelMessageCount = QtWidgets.QLabel(parent=self.networkstatus) +- self.labelMessageCount.setGeometry(QtCore.QRect(350, 130, 361, 16)) +- self.labelMessageCount.setObjectName("labelMessageCount") +- self.labelPubkeyCount = QtWidgets.QLabel(parent=self.networkstatus) +- self.labelPubkeyCount.setGeometry(QtCore.QRect(350, 170, 331, 16)) +- self.labelPubkeyCount.setObjectName("labelPubkeyCount") +- self.labelBroadcastCount = QtWidgets.QLabel(parent=self.networkstatus) +- self.labelBroadcastCount.setGeometry(QtCore.QRect(350, 150, 351, 16)) +- self.labelBroadcastCount.setObjectName("labelBroadcastCount") +- self.labelLookupsPerSecond = QtWidgets.QLabel(parent=self.networkstatus) +- self.labelLookupsPerSecond.setGeometry(QtCore.QRect(320, 250, 291, 16)) +- self.labelLookupsPerSecond.setObjectName("labelLookupsPerSecond") +- self.labelBytesRecvCount = QtWidgets.QLabel(parent=self.networkstatus) +- self.labelBytesRecvCount.setGeometry(QtCore.QRect(350, 210, 251, 16)) +- self.labelBytesRecvCount.setObjectName("labelBytesRecvCount") +- self.labelBytesSentCount = QtWidgets.QLabel(parent=self.networkstatus) +- self.labelBytesSentCount.setGeometry(QtCore.QRect(350, 230, 251, 16)) +- self.labelBytesSentCount.setObjectName("labelBytesSentCount") +- icon11 = QtGui.QIcon() +- icon11.addPixmap(QtGui.QPixmap(":/newPrefix/images/networkstatus.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) +- self.tabWidget.addTab(self.networkstatus, icon11, "") + self.tabWidget.addTab(self.blackwhitelist, QtGui.QIcon(":/newPrefix/images/blacklist.png"), "") + # Initialize the Blacklist or Whitelist + if config.get('bitmessagesettings', 'blackwhitelist') == 'white': + self.blackwhitelist.radioButtonWhitelist.click() + self.blackwhitelist.rerenderBlackWhiteList() + - self.gridLayout_6 = QtWidgets.QGridLayout(self.blackwhitelist) - self.gridLayout_6.setObjectName("gridLayout_6") - self.radioButtonBlacklist = QtWidgets.QRadioButton(parent=self.blackwhitelist) -@@ -462,7 +480,8 @@ - icon9 = QtGui.QIcon() - icon9.addPixmap(QtGui.QPixmap(":/newPrefix/images/blacklist.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - self.tabWidget.addTab(self.blackwhitelist, icon9, "") -- self.networkstatus = QtWidgets.QWidget() + self.networkstatus = NetworkStatus() + self.tabWidget.addTab(self.networkstatus, QtGui.QIcon(":/newPrefix/images/networkstatus.png"), "") - self.networkstatus.setObjectName("networkstatus") - self.pushButtonStatusIcon = QtWidgets.QPushButton(parent=self.networkstatus) - self.pushButtonStatusIcon.setGeometry(QtCore.QRect(680, 440, 21, 23)) -@@ -530,7 +549,7 @@ - self.tabWidget.addTab(self.networkstatus, icon11, "") self.gridLayout_10.addWidget(self.tabWidget, 0, 0, 1, 1) self.MainDock.setWidget(self.centralwidget) - MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(None), self.MainDock) @@ -77,7 +273,7 @@ self.menubar = QtWidgets.QMenuBar(parent=MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 885, 27)) self.menubar.setObjectName("menubar") -@@ -550,6 +569,8 @@ +@@ -550,6 +470,8 @@ self.actionManageKeys = QtGui.QAction(parent=MainWindow) self.actionManageKeys.setCheckable(False) self.actionManageKeys.setEnabled(True) @@ -86,7 +282,7 @@ icon = QtGui.QIcon.fromTheme("dialog-password") self.actionManageKeys.setIcon(icon) self.actionManageKeys.setObjectName("actionManageKeys") -@@ -561,6 +582,10 @@ +@@ -561,6 +483,10 @@ icon = QtGui.QIcon.fromTheme("help-contents") self.actionHelp.setIcon(icon) self.actionHelp.setObjectName("actionHelp") @@ -97,7 +293,7 @@ self.actionAbout = QtGui.QAction(parent=MainWindow) icon = QtGui.QIcon.fromTheme("help-about") self.actionAbout.setIcon(icon) -@@ -584,9 +609,11 @@ +@@ -584,17 +510,23 @@ self.menuFile.addAction(self.actionManageKeys) self.menuFile.addAction(self.actionDeleteAllTrashedMessages) self.menuFile.addAction(self.actionRegenerateDeterministicAddresses) @@ -109,10 +305,31 @@ self.menuHelp.addAction(self.actionAbout) self.menubar.addAction(self.menuFile.menuAction()) self.menubar.addAction(self.menuSettings.menuAction()) -@@ -610,6 +637,26 @@ - MainWindow.setTabOrder(self.tableWidgetBlacklist, self.tableWidgetConnectionCount) - MainWindow.setTabOrder(self.tableWidgetConnectionCount, self.pushButtonStatusIcon) + self.menubar.addAction(self.menuHelp.menuAction()) + self.retranslateUi(MainWindow) +- self.tabWidget.setCurrentIndex(0) +- self.tabWidgetSend.setCurrentIndex(0) ++ self.tabWidget.setCurrentIndex( ++ self.tabWidget.indexOf(self.inbox) ++ ) ++ self.tabWidgetSend.setCurrentIndex( ++ self.tabWidgetSend.indexOf(self.sendDirect) ++ ) + QtCore.QMetaObject.connectSlotsByName(MainWindow) + MainWindow.setTabOrder(self.tableWidgetInbox, self.textEditInboxMessage) + MainWindow.setTabOrder(self.textEditInboxMessage, self.comboBoxSendFrom) +@@ -603,12 +535,26 @@ + MainWindow.setTabOrder(self.lineEditSubject, self.textEditMessage) + MainWindow.setTabOrder(self.textEditMessage, self.pushButtonSend) + MainWindow.setTabOrder(self.pushButtonSend, self.pushButtonAddSubscription) +- MainWindow.setTabOrder(self.pushButtonAddSubscription, self.radioButtonBlacklist) +- MainWindow.setTabOrder(self.radioButtonBlacklist, self.radioButtonWhitelist) +- MainWindow.setTabOrder(self.radioButtonWhitelist, self.pushButtonAddBlacklist) +- MainWindow.setTabOrder(self.pushButtonAddBlacklist, self.tableWidgetBlacklist) +- MainWindow.setTabOrder(self.tableWidgetBlacklist, self.tableWidgetConnectionCount) +- MainWindow.setTabOrder(self.tableWidgetConnectionCount, self.pushButtonStatusIcon) ++ + # Popup menu actions container for the Sent page + # pylint: disable=attribute-defined-outside-init + self.sentContextMenuToolbar = QtWidgets.QToolBar() @@ -132,30 +349,59 @@ + if dontconnect else + _translate("MainWindow", "Go offline", None) + ) -+ + def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate - self.MainDock.setWindowTitle(_translate("MainWindow", "Bitmessage")) -@@ -657,6 +704,7 @@ +@@ -646,7 +592,7 @@ + "p, li { white-space: pre-wrap; }\n" + "\n" + "


")) +- self.tabWidgetSend.setTabText(self.tabWidgetSend.indexOf(self.tab), _translate("MainWindow", "Send ordinary Message")) ++ self.tabWidgetSend.setTabText(self.tabWidgetSend.indexOf(self.sendDirect), _translate("MainWindow", "Send ordinary Message")) + self.label_8.setText(_translate("MainWindow", "From:")) + self.label_7.setText(_translate("MainWindow", "Subject:")) + self.textEditMessageBroadcast.setHtml(_translate("MainWindow", "\n" +@@ -656,7 +602,7 @@ + "


")) self.tabWidgetSend.setTabText(self.tabWidgetSend.indexOf(self.tab_2), _translate("MainWindow", "Send Message to your Subscribers")) self.pushButtonTTL.setText(_translate("MainWindow", "TTL:")) - self.labelHumanFriendlyTTLDescription.setText(_translate("MainWindow", "X days")) +- self.labelHumanFriendlyTTLDescription.setText(_translate("MainWindow", "X days")) + self.pushButtonClear.setText(_translate("MainWindow", "Clear")) self.pushButtonSend.setText(_translate("MainWindow", "Send")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.send), _translate("MainWindow", "Send")) self.treeWidgetSubscriptions.headerItem().setText(0, _translate("MainWindow", "Subscriptions")) -@@ -703,7 +751,10 @@ - item.setText(_translate("MainWindow", "Name or Label")) - item = self.tableWidgetBlacklist.horizontalHeaderItem(1) - item.setText(_translate("MainWindow", "Address")) -+ self.blackwhitelist.retranslateUi() - self.tabWidget.setTabText(self.tabWidget.indexOf(self.blackwhitelist), _translate("MainWindow", "Blacklist")) +@@ -694,28 +640,8 @@ + item.setText(_translate("MainWindow", "Subject")) + item = self.tableWidgetInboxChans.horizontalHeaderItem(3) + item.setText(_translate("MainWindow", "Received")) +- self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), _translate("MainWindow", "Chans")) +- self.radioButtonBlacklist.setText(_translate("MainWindow", "Use a Blacklist (Allow all incoming messages except those on the Blacklist)")) +- self.radioButtonWhitelist.setText(_translate("MainWindow", "Use a Whitelist (Block all incoming messages except those on the Whitelist)")) +- self.pushButtonAddBlacklist.setText(_translate("MainWindow", "Add new entry")) +- self.tableWidgetBlacklist.setSortingEnabled(True) +- item = self.tableWidgetBlacklist.horizontalHeaderItem(0) +- item.setText(_translate("MainWindow", "Name or Label")) +- item = self.tableWidgetBlacklist.horizontalHeaderItem(1) +- item.setText(_translate("MainWindow", "Address")) +- self.tabWidget.setTabText(self.tabWidget.indexOf(self.blackwhitelist), _translate("MainWindow", "Blacklist")) +- item = self.tableWidgetConnectionCount.horizontalHeaderItem(0) +- item.setText(_translate("MainWindow", "Stream #")) +- item = self.tableWidgetConnectionCount.horizontalHeaderItem(1) +- item.setText(_translate("MainWindow", "Connections")) +- self.labelTotalConnections.setText(_translate("MainWindow", "Total connections:")) +- self.labelStartupTime.setText(_translate("MainWindow", "Since startup:")) +- self.labelMessageCount.setText(_translate("MainWindow", "Processed 0 person-to-person messages.")) +- self.labelPubkeyCount.setText(_translate("MainWindow", "Processed 0 public keys.")) +- self.labelBroadcastCount.setText(_translate("MainWindow", "Processed 0 broadcasts.")) +- self.labelLookupsPerSecond.setText(_translate("MainWindow", "Inventory lookups per second: 0")) +- self.labelBytesRecvCount.setText(_translate("MainWindow", "Down: 0 KB/s")) +- self.labelBytesSentCount.setText(_translate("MainWindow", "Up: 0 KB/s")) ++ self.tabWidget.setTabText(self.tabWidget.indexOf(self.chans), _translate("MainWindow", "Chans")) + self.networkstatus.retranslateUi() -+ self.tabWidget.setTabText(self.tabWidget.indexOf(self.networkstatus), _translate("MainWindow", "Network Status")) - item = self.tableWidgetConnectionCount.horizontalHeaderItem(0) - item.setText(_translate("MainWindow", "Stream #")) - item = self.tableWidgetConnectionCount.horizontalHeaderItem(1) -@@ -726,8 +777,10 @@ + self.tabWidget.setTabText(self.tabWidget.indexOf(self.networkstatus), _translate("MainWindow", "Network Status")) + self.menuFile.setTitle(_translate("MainWindow", "File")) + self.menuSettings.setTitle(_translate("MainWindow", "Settings")) +@@ -726,8 +652,10 @@ self.actionExit.setShortcut(_translate("MainWindow", "Ctrl+Q")) self.actionHelp.setText(_translate("MainWindow", "Help")) self.actionHelp.setShortcut(_translate("MainWindow", "F1")) diff --git a/src/bitmessageqt/blacklist.py b/src/bitmessageqt/blacklist.py index ec03f66132..87520c9225 100644 --- a/src/bitmessageqt/blacklist.py +++ b/src/bitmessageqt/blacklist.py @@ -51,7 +51,7 @@ def click_radioButtonWhitelist(self): def click_pushButtonAddBlacklist(self): self.NewBlacklistDialogInstance = AddAddressDialog(self) - if self.NewBlacklistDialogInstance.exec_(): + if self.NewBlacklistDialogInstance.exec(): if self.NewBlacklistDialogInstance.labelAddressCheck.text() == \ _translate("MainWindow", "Address is valid."): address = addBMIfNotPresent(str( @@ -68,16 +68,16 @@ def click_pushButtonAddBlacklist(self): if queryreturn == []: self.tableWidgetBlacklist.setSortingEnabled(False) self.tableWidgetBlacklist.insertRow(0) - newItem = QtGui.QTableWidgetItem(unicode( - self.NewBlacklistDialogInstance.lineEditLabel.text().toUtf8(), 'utf-8')) + newItem = QtWidgets.QTableWidgetItem( + self.NewBlacklistDialogInstance.lineEditLabel.text()) newItem.setIcon(avatarize(address)) self.tableWidgetBlacklist.setItem(0, 0, newItem) - newItem = QtGui.QTableWidgetItem(address) + newItem = QtWidgets.QTableWidgetItem(address) newItem.setFlags( - QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) + QtCore.Qt.ItemFlag.ItemIsSelectable | QtCore.Qt.ItemFlag.ItemIsEnabled) self.tableWidgetBlacklist.setItem(0, 1, newItem) self.tableWidgetBlacklist.setSortingEnabled(True) - t = (str(self.NewBlacklistDialogInstance.lineEditLabel.text().toUtf8()), address, True) + t = (self.NewBlacklistDialogInstance.lineEditLabel.text(), address, True) if config.get('bitmessagesettings', 'blackwhitelist') == 'black': sql = '''INSERT INTO blacklist VALUES (?,?,?)''' else: @@ -103,7 +103,7 @@ def click_pushButtonAddBlacklist(self): def tableWidgetBlacklistItemChanged(self, item): if item.column() == 0: addressitem = self.tableWidgetBlacklist.item(item.row(), 1) - if isinstance(addressitem, QtGui.QTableWidgetItem): + if isinstance(addressitem, QtWidgets.QTableWidgetItem): if self.radioButtonBlacklist.isChecked(): sqlExecute('''UPDATE blacklist SET label=? WHERE address=?''', str(item.text()), str(addressitem.text())) @@ -165,14 +165,14 @@ def rerenderBlackWhiteList(self): for row in queryreturn: label, address, enabled = row self.tableWidgetBlacklist.insertRow(0) - newItem = QtWidgets.QTableWidgetItem(unicode(label, 'utf-8')) + newItem = QtWidgets.QTableWidgetItem(label) if not enabled: newItem.setTextColor(QtGui.QColor(128, 128, 128)) newItem.setIcon(avatarize(address)) self.tableWidgetBlacklist.setItem(0, 0, newItem) newItem = QtWidgets.QTableWidgetItem(address) newItem.setFlags( - QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) + QtCore.Qt.ItemFlag.ItemIsSelectable | QtCore.Qt.ItemFlag.ItemIsEnabled) if not enabled: newItem.setTextColor(QtGui.QColor(128, 128, 128)) self.tableWidgetBlacklist.setItem(0, 1, newItem) @@ -185,7 +185,7 @@ def on_action_BlacklistNew(self): def on_action_BlacklistDelete(self): currentRow = self.tableWidgetBlacklist.currentRow() labelAtCurrentRow = self.tableWidgetBlacklist.item( - currentRow, 0).text().toUtf8() + currentRow, 0).text() addressAtCurrentRow = self.tableWidgetBlacklist.item( currentRow, 1).text() if config.get('bitmessagesettings', 'blackwhitelist') == 'black': @@ -202,11 +202,11 @@ def on_action_BlacklistClipboard(self): currentRow = self.tableWidgetBlacklist.currentRow() addressAtCurrentRow = self.tableWidgetBlacklist.item( currentRow, 1).text() - clipboard = QtGui.QApplication.clipboard() + clipboard = QtWidgets.QApplication.clipboard() clipboard.setText(str(addressAtCurrentRow)) def on_context_menuBlacklist(self, point): - self.popMenuBlacklist.exec_( + self.popMenuBlacklist.exec( self.tableWidgetBlacklist.mapToGlobal(point)) def on_action_BlacklistEnable(self): @@ -214,9 +214,9 @@ def on_action_BlacklistEnable(self): addressAtCurrentRow = self.tableWidgetBlacklist.item( currentRow, 1).text() self.tableWidgetBlacklist.item( - currentRow, 0).setTextColor(QtGui.QApplication.palette().text().color()) + currentRow, 0).setTextColor(QtWidgets.QApplication.palette().text().color()) self.tableWidgetBlacklist.item( - currentRow, 1).setTextColor(QtGui.QApplication.palette().text().color()) + currentRow, 1).setTextColor(QtWidgets.QApplication.palette().text().color()) if config.get('bitmessagesettings', 'blackwhitelist') == 'black': sqlExecute( '''UPDATE blacklist SET enabled=1 WHERE address=?''', diff --git a/src/bitmessageqt/foldertree.py b/src/bitmessageqt/foldertree.py index 922854d417..1f9c20be31 100644 --- a/src/bitmessageqt/foldertree.py +++ b/src/bitmessageqt/foldertree.py @@ -124,8 +124,7 @@ def defaultLabel(self): AccountMixin.NORMAL, AccountMixin.CHAN, AccountMixin.MAILINGLIST): try: - retval = str( - config.get(self.address, 'label'), 'utf-8') + retval = config.get(self.address, 'label') except Exception: queryreturn = sqlQuery( '''select label from addressbook where address=?''', self.address) @@ -136,12 +135,11 @@ def defaultLabel(self): if queryreturn != []: for row in queryreturn: retval, = row - retval = str(retval, 'utf-8') + retval = retval elif self.address is None or self.type == AccountMixin.ALL: - return str( - str(_translate("MainWindow", "All accounts")), 'utf-8') + return _translate("MainWindow", "All accounts") - return retval or str(self.address, 'utf-8') + return retval or self.address class BMTreeWidgetItem(QtWidgets.QTreeWidgetItem, AccountMixin): @@ -236,11 +234,9 @@ def _getLabel(self): "MainWindow", "All accounts") else: try: - return str( - config.get(self.address, 'label'), - 'utf-8', 'ignore') + return config.get(self.address, 'label') except: - return str(self.address, 'utf-8') + return self.address def _getAddressBracket(self, unreadCount=False): ret = "" if self.isExpanded() \ @@ -264,8 +260,8 @@ def setData(self, column, role, value): if role == QtCore.Qt.ItemDataRole.EditRole \ and self.type != AccountMixin.SUBSCRIPTION: config.set( - str(self.address), 'label', - str(value.toString().toUtf8()) + self.address, 'label', + value.toString() if isinstance(value, QtCore.QVariant) else value.encode('utf-8') ) @@ -311,8 +307,8 @@ def _getLabel(self): if queryreturn != []: for row in queryreturn: retval, = row - return str(retval, 'utf-8', 'ignore') - return str(self.address, 'utf-8') + return retval + return self.address def setType(self): """Set account type""" @@ -323,10 +319,9 @@ def setData(self, column, role, value): """Save subscription label to database""" if role == QtCore.Qt.ItemDataRole.EditRole: if isinstance(value, QtCore.QVariant): - label = str( - value.toString().toUtf8()).decode('utf-8', 'ignore') + label = value.toString() else: - label = str(value, 'utf-8', 'ignore') + label = value sqlExecute( '''UPDATE subscriptions SET label=? WHERE address=?''', label, self.address) @@ -407,9 +402,7 @@ def setLabel(self, label=None): AccountMixin.NORMAL, AccountMixin.CHAN, AccountMixin.MAILINGLIST): try: - newLabel = str( - config.get(self.address, 'label'), - 'utf-8', 'ignore') + newLabel = config.get(self.address, 'label') except: queryreturn = sqlQuery( '''select label from addressbook where address=?''', self.address) @@ -418,7 +411,7 @@ def setLabel(self, label=None): '''select label from subscriptions where address=?''', self.address) if queryreturn: for row in queryreturn: - newLabel = str(row[0], 'utf-8', 'ignore') + newLabel = row[0] self.label = newLabel @@ -456,7 +449,7 @@ def data(self, role): if role == QtCore.Qt.ItemDataRole.UserRole: return self.subject if role == QtCore.Qt.ItemDataRole.ToolTipRole: - return escape(str(self.subject, 'utf-8')) + return escape(self.subject) return super(MessageList_SubjectWidget, self).data(role) # label (or address) alphabetically, disabled at the end @@ -513,10 +506,7 @@ def data(self, role): def setData(self, role, value): """Set data""" if role == QtCore.Qt.ItemDataRole.EditRole: - self.label = str( - value.toString().toUtf8() - if isinstance(value, QtCore.QVariant) else value - ) + self.label = value.toString() if isinstance(value, QtCore.QVariant) else value if self.type in ( AccountMixin.NORMAL, AccountMixin.MAILINGLIST, AccountMixin.CHAN): @@ -584,14 +574,13 @@ def onCursorPositionChanged(self, oldPos, newPos): # pylint: disable=unused-arg def splitPath(self, path): """Split on semicolon""" - text = str(path.toUtf8(), 'utf-8') + text = path return [text[:self.widget().cursorPosition()].split(';')[-1].strip()] def pathFromIndex(self, index): """Perform autocompletion (reimplemented QCompleter method)""" - autoString = str( - index.data(QtCore.Qt.ItemDataRole.EditRole).toString().toUtf8(), 'utf-8') - text = str(self.widget().text().toUtf8(), 'utf-8') + autoString = index.data(QtCore.Qt.ItemDataRole.EditRole).toString() + text = self.widget().text() # If cursor position was saved, restore it, else save it if self.cursorPos != -1: diff --git a/src/bitmessageqt/languagebox.py b/src/bitmessageqt/languagebox.py index 34f96b02a7..00ead98ae8 100644 --- a/src/bitmessageqt/languagebox.py +++ b/src/bitmessageqt/languagebox.py @@ -3,13 +3,13 @@ import glob import os -from PyQt4 import QtCore, QtGui +from PyQt6 import QtCore, QtGui, QtWidgets import paths from bmconfigparser import config -class LanguageBox(QtGui.QComboBox): +class LanguageBox(QtWidgets.QComboBox): """LanguageBox class for Qt UI""" languageName = { "system": "System Settings", "eo": "Esperanto", @@ -17,17 +17,17 @@ class LanguageBox(QtGui.QComboBox): } def __init__(self, parent=None): - super(QtGui.QComboBox, self).__init__(parent) + super(QtWidgets.QComboBox, self).__init__(parent) self.populate() def populate(self): """Populates drop down list with all available languages.""" self.clear() localesPath = os.path.join(paths.codePath(), 'translations') - self.addItem(QtGui.QApplication.translate( + self.addItem(QtWidgets.QApplication.translate( "settingsDialog", "System Settings", "system"), "system") self.setCurrentIndex(0) - self.setInsertPolicy(QtGui.QComboBox.InsertAlphabetically) + self.setInsertPolicy(QtWidgets.QComboBox.InsertPolicy.InsertAlphabetically) for translationFile in sorted( glob.glob(os.path.join(localesPath, "bitmessage_*.qm")) ): diff --git a/src/bitmessageqt/messagecompose.py b/src/bitmessageqt/messagecompose.py index 6c3af10efb..65fbddb6cf 100644 --- a/src/bitmessageqt/messagecompose.py +++ b/src/bitmessageqt/messagecompose.py @@ -24,10 +24,7 @@ def wheelEvent(self, event): self.zoomOut(1) zoom = self.currentFont().pointSize() * 100 / self.defaultFontPointSize QtGui.QApplication.activeWindow().statusBar().showMessage( - QtGui.QApplication.translate("MainWindow", "Zoom level %1%").arg( - str(zoom) - ) - ) + QtGui.QApplication.translate("MainWindow", "Zoom level {0}%").format(str(zoom))) else: # in QTextEdit, super does not zoom, only scroll super(MessageCompose, self).wheelEvent(event) diff --git a/src/bitmessageqt/networkstatus.py b/src/bitmessageqt/networkstatus.py index 4a7b2ee640..e89e0fd453 100644 --- a/src/bitmessageqt/networkstatus.py +++ b/src/bitmessageqt/networkstatus.py @@ -164,7 +164,7 @@ def updateNetworkStatusTab(self, outbound, add, destination): ) self.tableWidgetConnectionCount.setItem( 0, 2, - QtWidgets.QTableWidgetItem("%s" % (c.userAgent)) + QtWidgets.QTableWidgetItem("%s" % (c.userAgent.decode())) ) self.tableWidgetConnectionCount.setItem( 0, 3, diff --git a/src/bitmessageqt/newaddressdialog.ui b/src/bitmessageqt/newaddressdialog.ui index 8b5276cc33..8a7cc6ae0a 100644 --- a/src/bitmessageqt/newaddressdialog.ui +++ b/src/bitmessageqt/newaddressdialog.ui @@ -375,7 +375,7 @@ The 'Random Number' option is selected by default but deterministic addresses ha radioButtonDeterministicAddress toggled(bool) groupBoxDeterministic - setShown(bool) + setVisible(bool) 92 @@ -391,7 +391,7 @@ The 'Random Number' option is selected by default but deterministic addresses ha radioButtonRandomAddress toggled(bool) groupBox - setShown(bool) + setVisible(bool) 72 diff --git a/src/bitmessageqt/newchandialog.py b/src/bitmessageqt/newchandialog.py index 9632c4f2a3..e244f0bd01 100644 --- a/src/bitmessageqt/newchandialog.py +++ b/src/bitmessageqt/newchandialog.py @@ -6,7 +6,7 @@ from PyQt6 import QtCore, QtGui, QtWidgets -import bitmessageqt.widgets +import bitmessageqt.widgets as widgets from addresses import addBMIfNotPresent from .addressvalidator import AddressValidator, PassPhraseValidator from queues import ( @@ -21,30 +21,33 @@ def __init__(self, parent=None): super(NewChanDialog, self).__init__(parent) widgets.load('newchandialog.ui', self) self.parent = parent - self.chanAddress.setValidator( - AddressValidator( - self.chanAddress, - self.chanPassPhrase, - self.validatorFeedback, - self.buttonBox, - False)) - self.chanPassPhrase.setValidator( - PassPhraseValidator( - self.chanPassPhrase, - self.chanAddress, - self.validatorFeedback, - self.buttonBox, - False)) + # XXX unresolved + #self.chanAddress.setValidator( + # AddressValidator( + # self.chanAddress, + # self.chanPassPhrase, + # self.validatorFeedback, + # self.buttonBox, + # False)) + # XXX unresolved + #self.chanPassPhrase.setValidator( + # PassPhraseValidator( + # self.chanPassPhrase, + # self.chanAddress, + # self.validatorFeedback, + # self.buttonBox, + # False)) self.timer = QtCore.QTimer() - QtCore.QObject.connect( # pylint: disable=no-member - self.timer, QtCore.SIGNAL("timeout()"), self.delayedUpdateStatus) + self.timer.timeout.connect(self.delayedUpdateStatus) self.timer.start(500) # milliseconds - self.setAttribute(QtCore.Qt.WA_DeleteOnClose) + self.setAttribute(QtCore.Qt.WidgetAttribute.WA_DeleteOnClose) self.show() def delayedUpdateStatus(self): """Related to updating the UI for the chan passphrase validity""" + # XXX unresolved + return self.chanPassPhrase.validator().checkQueue() def accept(self): @@ -52,32 +55,32 @@ def accept(self): self.timer.stop() self.hide() apiAddressGeneratorReturnQueue.queue.clear() - if self.chanAddress.text().toUtf8() == "": + if self.chanAddress.text() == "": addressGeneratorQueue.put( - ('createChan', 4, 1, str_chan + ' ' + str(self.chanPassPhrase.text().toUtf8()), - self.chanPassPhrase.text().toUtf8(), + ('createChan', 4, 1, str_chan + ' ' + self.chanPassPhrase.text(), + self.chanPassPhrase.text(), True)) else: addressGeneratorQueue.put( - ('joinChan', addBMIfNotPresent(self.chanAddress.text().toUtf8()), - str_chan + ' ' + str(self.chanPassPhrase.text().toUtf8()), - self.chanPassPhrase.text().toUtf8(), + ('joinChan', addBMIfNotPresent(self.chanAddress.text()), + str_chan + ' ' + self.chanPassPhrase.text(), + self.chanPassPhrase.text(), True)) addressGeneratorReturnValue = apiAddressGeneratorReturnQueue.get(True) if addressGeneratorReturnValue and addressGeneratorReturnValue[0] != 'chan name does not match address': UISignalQueue.put(('updateStatusBar', _translate( - "newchandialog", "Successfully created / joined chan %1").arg(unicode(self.chanPassPhrase.text())))) + "newchandialog", "Successfully created / joined chan {0}").format(self.chanPassPhrase.text()))) self.parent.ui.tabWidget.setCurrentIndex( self.parent.ui.tabWidget.indexOf(self.parent.ui.chans) ) - self.done(QtGui.QDialog.Accepted) + self.done(QtWidgets.QDialog.DialogCode.Accepted) else: UISignalQueue.put(('updateStatusBar', _translate("newchandialog", "Chan creation / joining failed"))) - self.done(QtGui.QDialog.Rejected) + self.done(QtWidgets.QDialog.DialogCode.Rejected) def reject(self): """Cancel joining the chan""" self.timer.stop() self.hide() UISignalQueue.put(('updateStatusBar', _translate("newchandialog", "Chan creation / joining cancelled"))) - self.done(QtGui.QDialog.Rejected) + self.done(QtWidgets.QDialog.DialogCode.Rejected) diff --git a/src/bitmessageqt/settings.py b/src/bitmessageqt/settings.py index 5546f8087f..161acf695e 100644 --- a/src/bitmessageqt/settings.py +++ b/src/bitmessageqt/settings.py @@ -1,7 +1,7 @@ """ This module setting file is for settings """ -from configparser import ConfigParser +import configparser import os import sys import tempfile @@ -16,7 +16,7 @@ import paths import queues import state -import bitmessageqt.widgets +import bitmessageqt.widgets as widgets from bmconfigparser import config as config_obj from helper_sql import sqlExecute, sqlStoredProcedure from helper_startup import start_proxyconfig @@ -29,9 +29,9 @@ def getSOCKSProxyType(config): """Get user socksproxytype setting from *config*""" try: - result = ConfigParser.SafeConfigParser.get( + result = configparser.ConfigParser.get( config, 'bitmessagesettings', 'socksproxytype') - except (ConfigParser.NoSectionError, ConfigParser.NoOptionError): + except (configparser.NoSectionError, configparser.NoOptionError): return None else: if result.lower() in ('', 'none', 'false'): @@ -80,7 +80,7 @@ def __init__(self, parent=None, firstrun=False): self.tabWidgetSettings.setCurrentIndex( self.tabWidgetSettings.indexOf(self.tabNetworkSettings) ) - QtGui.QWidget.resize(self, QtGui.QWidget.sizeHint(self)) + QtWidgets.QWidget.resize(self, QtWidgets.QWidget.sizeHint(self)) def adjust_from_config(self, config): """Adjust all widgets state according to config settings""" @@ -163,7 +163,7 @@ def adjust_from_config(self, config): self.comboBoxProxyTypeChanged(self.comboBoxProxyType.currentIndex()) if self._proxy_type: - for node, info in six.items( + for node, info in six.iteritems( knownnodes.knownNodes.get( min(state.streamsInWhichIAmParticipating), []) ): @@ -348,8 +348,8 @@ def accept(self): self.config.set('bitmessagesettings', 'replybelow', str( self.checkBoxReplyBelow.isChecked())) - lang = str(self.languageComboBox.itemData( - self.languageComboBox.currentIndex()).toString()) + lang = self.languageComboBox.itemData( + self.languageComboBox.currentIndex()) self.config.set('bitmessagesettings', 'userlocale', lang) self.parent.change_translation() @@ -431,7 +431,7 @@ def accept(self): self.config.set('bitmessagesettings', 'maxuploadrate', str( int(float(self.lineEditMaxUploadRate.text())))) except ValueError: - QtGui.QMessageBox.about( + QtWidgets.QMessageBox.about( self, _translate("MainWindow", "Number needed"), _translate( "MainWindow", @@ -472,7 +472,7 @@ def accept(self): float(self.lineEditSmallMessageDifficulty.text()) * defaults.networkDefaultPayloadLengthExtraBytes))) - if self.comboBoxOpenCL.currentText().toUtf8() != self.config.safeGet( + if self.comboBoxOpenCL.currentText() != self.config.safeGet( 'bitmessagesettings', 'opencl'): self.config.set( 'bitmessagesettings', 'opencl', @@ -555,7 +555,7 @@ def accept(self): if state.maximumLengthOfTimeToBotherResendingMessages < 432000: # If the time period is less than 5 hours, we give # zero values to all fields. No message will be sent again. - QtGui.QMessageBox.about( + QtWidgets.QMessageBox.about( self, _translate("MainWindow", "Will not resend ever"), _translate( diff --git a/src/bitmessageqt/support.py b/src/bitmessageqt/support.py index 7215b51b35..6cb07287ee 100644 --- a/src/bitmessageqt/support.py +++ b/src/bitmessageqt/support.py @@ -8,7 +8,7 @@ from PyQt6 import QtCore -import bitmessageqt.account +import bitmessageqt.account as account import defaults import network.stats import paths @@ -72,7 +72,7 @@ def checkAddressBook(myapp): if queryreturn == []: sqlExecute( 'INSERT INTO addressbook VALUES (?,?)', - SUPPORT_LABEL.toUtf8(), SUPPORT_ADDRESS) + SUPPORT_LABEL, SUPPORT_ADDRESS) myapp.rerenderAddressBook() @@ -88,7 +88,7 @@ def createAddressIfNeeded(myapp): if not checkHasNormalAddress(): queues.addressGeneratorQueue.put(( 'createRandomAddress', 4, 1, - str(SUPPORT_MY_LABEL.toUtf8()), + SUPPORT_MY_LABEL, 1, "", False, defaults.networkDefaultProofOfWorkNonceTrialsPerByte, defaults.networkDefaultPayloadLengthExtraBytes @@ -107,8 +107,8 @@ def createSupportMessage(myapp): myapp.ui.lineEditSubject.setText(SUPPORT_SUBJECT) addrIndex = myapp.ui.comboBoxSendFrom.findData( - address, QtCore.Qt.UserRole, - QtCore.Qt.MatchFixedString | QtCore.Qt.MatchCaseSensitive) + address, QtCore.Qt.ItemDataRole.UserRole, + QtCore.Qt.MatchFlag.MatchFixedString | QtCore.Qt.MatchFlag.MatchCaseSensitive) if addrIndex == -1: # something is very wrong return myapp.ui.comboBoxSendFrom.setCurrentIndex(addrIndex) @@ -149,7 +149,7 @@ def createSupportMessage(myapp): upnp = config.safeGet('bitmessagesettings', 'upnp', "N/A") connectedhosts = len(network.stats.connectedHostsList()) - myapp.ui.textEditMessage.setText(unicode(SUPPORT_MESSAGE, 'utf-8').format( + myapp.ui.textEditMessage.setText(SUPPORT_MESSAGE.format( version, os, architecture, pythonversion, opensslversion, frozen, portablemode, cpow, openclpow, locale, socks, upnp, connectedhosts)) diff --git a/src/class_addressGenerator.py b/src/class_addressGenerator.py index 929ac36475..4e3112a54e 100644 --- a/src/class_addressGenerator.py +++ b/src/class_addressGenerator.py @@ -213,8 +213,8 @@ def run(self): 'updateStatusBar', _translate( "MainWindow", - "Generating %1 new addresses." - ).arg(str(numberOfAddressesToMake)) + "Generating {0} new addresses." + ).format(numberOfAddressesToMake) )) signingKeyNonce = 0 encryptionKeyNonce = 1 @@ -306,9 +306,9 @@ def run(self): 'updateStatusBar', _translate( "MainWindow", - "%1 is already in 'Your Identities'." + "{0} is already in 'Your Identities'." " Not adding it again." - ).arg(address) + ).format(address) )) else: self.logger.debug('label: %s', label) diff --git a/src/highlevelcrypto.py b/src/highlevelcrypto.py index d7af85de11..551aa376b4 100644 --- a/src/highlevelcrypto.py +++ b/src/highlevelcrypto.py @@ -85,7 +85,7 @@ def random_keys(): def deterministic_keys(passphrase, nonce): """Generate keys from *passphrase* and *nonce* (encoded as varint)""" - priv = hashlib.sha512(passphrase + nonce).digest()[:32] + priv = hashlib.sha512(passphrase.encode() + nonce).digest()[:32] pub = pointMult(priv) return priv, pub From 741f8dd4617eeed76f2d59172d25ed32613f9bb6 Mon Sep 17 00:00:00 2001 From: Kashiko Koibumi Date: Tue, 14 May 2024 23:28:16 +0900 Subject: [PATCH 05/32] fix some parts of inventory syncing Remained works: * Objects are not saved. * Decryption does not work. * Can not shutdown. --- src/api.py | 2 +- src/bitmessageqt/__init__.py | 2 +- src/bitmessageqt/networkstatus.py | 2 +- src/class_addressGenerator.py | 14 ++++++------ src/class_objectProcessor.py | 31 +++++++++++++++----------- src/class_singleWorker.py | 36 +++++++++++++++++++------------ src/inventory.py | 6 ++++-- src/network/bmproto.py | 34 ++++++++++++++++------------- src/network/dandelion.py | 20 +++++++++++------ src/network/downloadthread.py | 4 +++- src/network/knownnodes.py | 6 +++++- src/network/objectracker.py | 15 +++++++------ src/network/tcp.py | 2 +- src/protocol.py | 3 ++- src/randomtrackingdict.py | 27 ++++++++++++++--------- src/shared.py | 6 ++++-- src/storage/filesystem.py | 18 ++++++++-------- src/storage/sqlite.py | 35 ++++++++++++++++-------------- src/tests/test_api_thread.py | 4 ++-- 19 files changed, 158 insertions(+), 109 deletions(-) diff --git a/src/api.py b/src/api.py index a444556951..656564c12a 100644 --- a/src/api.py +++ b/src/api.py @@ -1347,7 +1347,7 @@ def HandleDisseminatePreparedObject( 'Broadcasting inv for msg(API disseminatePreEncryptedMsg' ' command): %s', hexlify(inventoryHash)) queues.invQueue.put((toStreamNumber, inventoryHash)) - return hexlify(inventoryHash).decode() + return hexlify(inventoryHash).decode('ascii') @command('trashSentMessageByAckData') def HandleTrashSentMessageByAckDAta(self, ackdata): diff --git a/src/bitmessageqt/__init__.py b/src/bitmessageqt/__init__.py index b7c19bfd24..f612e48adc 100644 --- a/src/bitmessageqt/__init__.py +++ b/src/bitmessageqt/__init__.py @@ -2683,7 +2683,7 @@ def quit(self): " %n object(s) to be downloaded. If you quit now," " it may cause delivery delays. Wait until the" " synchronisation finishes?", None, - QtCore.QCoreApplication.CodecForTr, pendingDownload() + pendingDownload() ), QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No | QtWidgets.QMessageBox.StandardButton.Cancel, QtWidgets.QMessageBox.StandardButton.Cancel) diff --git a/src/bitmessageqt/networkstatus.py b/src/bitmessageqt/networkstatus.py index e89e0fd453..ac84f5245a 100644 --- a/src/bitmessageqt/networkstatus.py +++ b/src/bitmessageqt/networkstatus.py @@ -164,7 +164,7 @@ def updateNetworkStatusTab(self, outbound, add, destination): ) self.tableWidgetConnectionCount.setItem( 0, 2, - QtWidgets.QTableWidgetItem("%s" % (c.userAgent.decode())) + QtWidgets.QTableWidgetItem("%s" % (c.userAgent.decode('utf-8', 'backslashreplace'))) ) self.tableWidgetConnectionCount.setItem( 0, 3, diff --git a/src/class_addressGenerator.py b/src/class_addressGenerator.py index 4e3112a54e..58e33badb7 100644 --- a/src/class_addressGenerator.py +++ b/src/class_addressGenerator.py @@ -172,10 +172,10 @@ def run(self): config.set(address, 'payloadlengthextrabytes', str( payloadLengthExtraBytes)) config.set( - address, 'privsigningkey', privSigningKeyWIF.decode()) + address, 'privsigningkey', privSigningKeyWIF.decode('ascii')) config.set( address, 'privencryptionkey', - privEncryptionKeyWIF.decode()) + privEncryptionKeyWIF.decode('ascii')) config.save() # The API and the join and create Chan functionality @@ -325,10 +325,10 @@ def run(self): str(payloadLengthExtraBytes)) config.set( address, 'privsigningkey', - privSigningKeyWIF.decode()) + privSigningKeyWIF.decode('ascii')) config.set( address, 'privencryptionkey', - privEncryptionKeyWIF.decode()) + privEncryptionKeyWIF.decode('ascii')) config.save() queues.UISignalQueue.put(( @@ -340,12 +340,14 @@ def run(self): shared.myECCryptorObjects[ripe] = \ highlevelcrypto.makeCryptor( hexlify(potentialPrivEncryptionKey)) - shared.myAddressesByHash[ripe] = address + hex_ripe = hexlify(ripe).decode('ascii') + shared.myAddressesByHash[hex_ripe] = address tag = highlevelcrypto.double_sha512( encodeVarint(addressVersionNumber) + encodeVarint(streamNumber) + ripe )[32:] - shared.myAddressesByTag[tag] = address + hex_tag = hexlify(tag).decode('ascii') + shared.myAddressesByTag[hex_tag] = address if addressVersionNumber == 3: # If this is a chan address, # the worker thread won't send out diff --git a/src/class_objectProcessor.py b/src/class_objectProcessor.py index 50c23e2c55..95c1f7e24f 100644 --- a/src/class_objectProcessor.py +++ b/src/class_objectProcessor.py @@ -141,9 +141,10 @@ def checkackdata(data): # bypass nonce and time, retain object type/version/stream + body readPosition = 16 - if data[readPosition:] in state.ackdataForWhichImWatching: + hex_data = hexlify(data[readPosition:]).decode('ascii') + if hex_data in state.ackdataForWhichImWatching: logger.info('This object is an acknowledgement bound for me.') - del state.ackdataForWhichImWatching[data[readPosition:]] + del state.ackdataForWhichImWatching[hex_data] sqlExecute( "UPDATE sent SET status='ackreceived', lastactiontime=?" " WHERE ackdata=?", int(time.time()), data[readPosition:]) @@ -217,19 +218,20 @@ def processgetpubkey(data): 'the hash requested in this getpubkey request is: %s', hexlify(requestedHash)) # if this address hash is one of mine - if requestedHash in shared.myAddressesByHash: - myAddress = shared.myAddressesByHash[requestedHash] + hex_hash = hexlify(requestedHash).decode('ascii') + if hex_hash in shared.myAddressesByHash: + myAddress = shared.myAddressesByHash[hex_hash] elif requestedAddressVersionNumber >= 4: requestedTag = data[readPosition:readPosition + 32] if len(requestedTag) != 32: return logger.debug( 'The length of the requested tag is not 32 bytes.' ' Something is wrong. Ignoring.') + hex_tag = hexlify(requestedTag).decode('ascii') logger.debug( - 'the tag requested in this getpubkey request is: %s', - hexlify(requestedTag)) - if requestedTag in shared.myAddressesByTag: - myAddress = shared.myAddressesByTag[requestedTag] + 'the tag requested in this getpubkey request is: %s', hex_tag) + if hex_tag in shared.myAddressesByTag: + myAddress = shared.myAddressesByTag[hex_tag] if myAddress == '': logger.info('This getpubkey request is not for any of my keys.') @@ -419,12 +421,13 @@ def processpubkey(self, data): ' Sanity check failed.') tag = data[readPosition:readPosition + 32] - if tag not in state.neededPubkeys: + hex_tag = 'tag-' + hexlify(tag).decode('ascii') + if hex_tag not in state.neededPubkeys: return logger.info( 'We don\'t need this v4 pubkey. We didn\'t ask for it.') # Let us try to decrypt the pubkey - toAddress = state.neededPubkeys[tag][0] + toAddress = state.neededPubkeys[hex_tag][0] if protocol.decryptAndCheckPubkeyPayload(data, toAddress) == \ 'successful': # At this point we know that we have been waiting on this @@ -489,7 +492,8 @@ def processmsg(self, data): # This is a message bound for me. # Look up my address based on the RIPE hash. - toAddress = shared.myAddressesByHash[toRipe] + hex_ripe = hexlify(toRipe).decode('ascii') + toAddress = shared.myAddressesByHash[hex_ripe] readPosition = 0 sendersAddressVersionNumber, sendersAddressVersionNumberLength = \ decodeVarint(decryptedData[readPosition:readPosition + 10]) @@ -1006,8 +1010,9 @@ def possibleNewPubkey(self, address): encodeVarint(addressVersion) + encodeVarint(streamNumber) + ripe )[32:] - if tag in state.neededPubkeys: - del state.neededPubkeys[tag] + hex_tag = 'tag-' + hexlify(tag).decode('ascii') + if hex_tag in state.neededPubkeys: + del state.neededPubkeys[hex_tag] self.sendMessages(address) @staticmethod diff --git a/src/class_singleWorker.py b/src/class_singleWorker.py index e7537f6b2d..6172aa1d3b 100644 --- a/src/class_singleWorker.py +++ b/src/class_singleWorker.py @@ -87,7 +87,8 @@ def run(self): tag = doubleHashOfAddressData[32:] # We'll need this for when we receive a pubkey reply: # it will be encrypted and we'll need to decrypt it. - state.neededPubkeys[tag] = ( + hex_tag = 'tag-' + hexlify(tag).decode('ascii') + state.neededPubkeys[hex_tag] = ( toAddress, highlevelcrypto.makeCryptor( hexlify(privEncryptionKey)) @@ -99,19 +100,22 @@ def run(self): for row in queryreturn: ackdata, = row self.logger.info('Watching for ackdata %s', hexlify(ackdata)) - state.ackdataForWhichImWatching[ackdata] = 0 + hex_ackdata = hexlify(ackdata).decode('ascii') + state.ackdataForWhichImWatching[hex_ackdata] = 0 # Fix legacy (headerless) watched ackdata to include header - for oldack in state.ackdataForWhichImWatching: + for hex_oldack in state.ackdataForWhichImWatching: + oldack = unhexlify(hex_oldack) if len(oldack) == 32: # attach legacy header, always constant (msg/1/1) - newack = '\x00\x00\x00\x02\x01\x01' + oldack - state.ackdataForWhichImWatching[newack] = 0 + newack = b'\x00\x00\x00\x02\x01\x01' + oldack + hex_newack = hexlify(newack).decode('ascii') + state.ackdataForWhichImWatching[hex_newack] = 0 sqlExecute( '''UPDATE sent SET ackdata=? WHERE ackdata=? AND folder = 'sent' ''', newack, oldack ) - del state.ackdataForWhichImWatching[oldack] + del state.ackdataForWhichImWatching[hex_oldack] # For the case if user deleted knownnodes # but is still having onionpeer objects in inventory @@ -516,8 +520,8 @@ def sendOnionPeerObj(self, peer=None): inventoryHash = highlevelcrypto.calculateInventoryHash(payload) state.Inventory[inventoryHash] = ( - objectType, streamNumber, buffer(payload), # noqa: F821 - embeddedTime, buffer(tag) # noqa: F821 + objectType, streamNumber, memoryview(payload), # noqa: F821 + embeddedTime, memoryview(tag) # noqa: F821 ) self.logger.info( 'sending inv (within sendOnionPeerObj function) for object: %s', @@ -794,8 +798,9 @@ def sendMsg(self): encodeVarint(toAddressVersionNumber) + encodeVarint(toStreamNumber) + toRipe )[32:] + hex_tag = 'tag-' + hexlify(toTag).decode('ascii') if toaddress in state.neededPubkeys or \ - toTag in state.neededPubkeys: + hex_tag in state.neededPubkeys: # We already sent a request for the pubkey sqlExecute( '''UPDATE sent SET status='awaitingpubkey', ''' @@ -836,7 +841,8 @@ def sendMsg(self): privEncryptionKey = doubleHashOfToAddressData[:32] # The second half of the sha512 hash. tag = doubleHashOfToAddressData[32:] - state.neededPubkeys[tag] = ( + hex_tag = 'tag-' + hexlify(tag).decode('ascii') + state.neededPubkeys[hex_tag] = ( toaddress, highlevelcrypto.makeCryptor( hexlify(privEncryptionKey)) @@ -859,7 +865,7 @@ def sendMsg(self): ''' status='doingpubkeypow') AND ''' ''' folder='sent' ''', toaddress) - del state.neededPubkeys[tag] + del state.neededPubkeys[hex_tag] break # else: # There was something wrong with this @@ -901,7 +907,8 @@ def sendMsg(self): # if we aren't sending this to ourselves or a chan if not config.has_section(toaddress): - state.ackdataForWhichImWatching[ackdata] = 0 + hex_ackdata = hexlify(ackdata).decode('ascii') + state.ackdataForWhichImWatching[hex_ackdata] = 0 queues.UISignalQueue.put(( 'updateSentItemStatusByAckdata', ( ackdata, @@ -1412,10 +1419,11 @@ def requestPubKey(self, toAddress): privEncryptionKey = doubleHashOfAddressData[:32] # Note that this is the second half of the sha512 hash. tag = doubleHashOfAddressData[32:] - if tag not in state.neededPubkeys: + hex_tag = 'tag-' + hexlify(tag).decode('ascii') + if hex_tag not in state.neededPubkeys: # We'll need this for when we receive a pubkey reply: # it will be encrypted and we'll need to decrypt it. - state.neededPubkeys[tag] = ( + state.neededPubkeys[hex_tag] = ( toAddress, highlevelcrypto.makeCryptor(hexlify(privEncryptionKey)) ) diff --git a/src/inventory.py b/src/inventory.py index 5b739e84bf..8356262cd6 100644 --- a/src/inventory.py +++ b/src/inventory.py @@ -28,8 +28,6 @@ def __init__(self): # cheap inheritance copied from asyncore def __getattr__(self, attr): - if attr == "__contains__": - self.numberOfInventoryLookupsPerformed += 1 try: realRet = getattr(self._realInventory, attr) except AttributeError: @@ -40,6 +38,10 @@ def __getattr__(self, attr): else: return realRet + def __contains__(self, key): + self.numberOfInventoryLookupsPerformed += 1 + return key in self._realInventory + # hint for pylint: this is dictionary like object def __getitem__(self, key): return self._realInventory[key] diff --git a/src/network/bmproto.py b/src/network/bmproto.py index 00967d1a52..980b302232 100644 --- a/src/network/bmproto.py +++ b/src/network/bmproto.py @@ -9,6 +9,7 @@ import socket import struct import time +from binascii import hexlify # magic imports! import addresses @@ -110,15 +111,16 @@ def state_bm_command(self): # pylint: disable=too-many-branches b"error", b"version", b"verack"): logger.error( 'Received command %s before connection was fully' - ' established, ignoring', self.command.decode()) + ' established, ignoring', self.command.decode('ascii', 'backslashreplace')) self.invalid = True if not self.invalid: try: retval = getattr( - self, "bm_command_" + self.command.decode().lower())() - except AttributeError: + self, "bm_command_" + self.command.decode('ascii', 'backslashreplace').lower())() + except AttributeError as err: + logger.debug('command = {}, err = {}'.format(self.command, err)) # unimplemented command - logger.debug('unimplemented command %s', self.command.decode()) + logger.debug('unimplemented command %s', self.command.decode('ascii', 'backslashreplace')) except BMProtoInsufficientDataError: logger.debug('packet length too short, skipping') except BMProtoExcessiveDataError: @@ -141,8 +143,8 @@ def state_bm_command(self): # pylint: disable=too-many-branches # broken read, ignore pass else: - logger.debug('Closing due to invalid command %s', self.command.decode()) - self.close_reason = "Invalid command %s" % self.command.decode() + logger.debug('Closing due to invalid command %s', self.command.decode('ascii', 'backslashreplace')) + self.close_reason = "Invalid command %s" % self.command.decode('ascii', 'backslashreplace') self.set_state("close") return False if retval: @@ -353,7 +355,7 @@ def _command_inv(self, dandelion=False): if dandelion and not state.dandelion_enabled: return True - for i in map(str, items): + for i in items: if i in state.Inventory and not state.Dandelion.hasHash(i): continue if dandelion and not state.Dandelion.hasHash(i): @@ -410,12 +412,13 @@ def bm_command_object(self): try: self.object.checkObjectByType() objectProcessorQueue.put(( - self.object.objectType, buffer(self.object.data))) # noqa: F821 + self.object.objectType, memoryview(self.object.data))) # noqa: F821 except BMObjectInvalidError: BMProto.stopDownloadingObject(self.object.inventoryHash, True) else: try: - del missingObjects[self.object.inventoryHash] + hex_hash = hexlify(self.object.inventoryHash).decode('ascii') + del missingObjects[hex_hash] except KeyError: pass @@ -426,8 +429,8 @@ def bm_command_object(self): state.Inventory[self.object.inventoryHash] = ( self.object.objectType, self.object.streamNumber, - buffer(self.payload[objectOffset:]), self.object.expiresTime, # noqa: F821 - buffer(self.object.tag) # noqa: F821 + memoryview(self.payload[objectOffset:]), self.object.expiresTime, # noqa: F821 + memoryview(self.object.tag) # noqa: F821 ) self.handleReceivedObject( self.object.streamNumber, self.object.inventoryHash) @@ -448,7 +451,7 @@ def bm_command_addr(self): try: if ( # FIXME: should check against complete list - ip.decode().startswith('bootstrap') + ip.decode('ascii', 'backslashreplace').startswith('bootstrap') ): continue except UnicodeDecodeError: @@ -529,7 +532,7 @@ def bm_command_version(self): logger.debug( 'remote node incoming address: %s:%i', self.destination.host, self.peerNode.port) - logger.debug('user agent: %s', self.userAgent) + logger.debug('user agent: %s', self.userAgent.decode('utf-8', 'backslashreplace')) logger.debug('streams: [%s]', ','.join(map(str, self.streams))) if not self.peerValidityChecks(): # ABORT afterwards @@ -537,7 +540,7 @@ def bm_command_version(self): self.append_write_buf(protocol.CreatePacket(b'verack')) self.verackSent = True ua_valid = re.match( - r'^/[a-zA-Z]+:[0-9]+\.?[\w\s\(\)\./:;-]*/$', self.userAgent.decode()) + r'^/[a-zA-Z]+:[0-9]+\.?[\w\s\(\)\./:;-]*/$', self.userAgent.decode('utf-8', 'backslashreplace')) if not ua_valid: self.userAgent = b'/INVALID:0/' if not self.isOutbound: @@ -656,7 +659,8 @@ def stopDownloadingObject(hashId, forwardAnyway=False): except KeyError: pass try: - del missingObjects[hashId] + hex_hash = hexlify(hashId).decode('ascii') + del missingObjects[hex_hash] except KeyError: pass diff --git a/src/network/dandelion.py b/src/network/dandelion.py index 02b34024d1..b5e6e49579 100644 --- a/src/network/dandelion.py +++ b/src/network/dandelion.py @@ -6,6 +6,7 @@ from random import choice, expovariate, sample from threading import RLock from time import time +from binascii import hexlify import network.connectionpool as connectionpool import state @@ -52,7 +53,8 @@ def addHash(self, hashId, source=None, stream=1): if not state.dandelion_enabled: return with self.lock: - self.hashMap[hashId] = Stem( + hex_hash = hexlify(hashId).decode('ascii') + self.hashMap[hex_hash] = Stem( self.getNodeStem(source), stream, self.poissonTimeout()) @@ -63,9 +65,10 @@ def setHashStream(self, hashId, stream=1): include streams, we only learn this after receiving the object) """ with self.lock: - if hashId in self.hashMap: - self.hashMap[hashId] = Stem( - self.hashMap[hashId].child, + hex_hash = hexlify(hashId).decode('ascii') + if hex_hash in self.hashMap: + self.hashMap[hex_hash] = Stem( + self.hashMap[hex_hash].child, stream, self.poissonTimeout()) @@ -77,17 +80,20 @@ def removeHash(self, hashId, reason="no reason specified"): ''.join('%02x' % ord(i) for i in hashId), reason) with self.lock: try: - del self.hashMap[hashId] + hex_hash = hexlify(hashId).decode('ascii') + del self.hashMap[hex_hash] except KeyError: pass def hasHash(self, hashId): """Is inventory vector in stem mode?""" - return hashId in self.hashMap + hex_hash = hexlify(hashId).decode('ascii') + return hex_hash in self.hashMap def objectChildStem(self, hashId): """Child (i.e. next) node for an inventory vector during stem mode""" - return self.hashMap[hashId].child + hex_hash = hexlify(hashId).decode('ascii') + return self.hashMap[hex_hash].child def maybeAddStem(self, connection): """ diff --git a/src/network/downloadthread.py b/src/network/downloadthread.py index a2e343f5bc..9900cc5a3b 100644 --- a/src/network/downloadthread.py +++ b/src/network/downloadthread.py @@ -9,6 +9,7 @@ import network.connectionpool as connectionpool from .objectracker import missingObjects from .threads import StoppableThread +from binascii import hexlify class DownloadThread(StoppableThread): @@ -67,7 +68,8 @@ def run(self): continue payload.extend(chunk) chunkCount += 1 - missingObjects[chunk] = now + hex_chunk = hexlify(chunk).decode('ascii') + missingObjects[hex_chunk] = now if not chunkCount: continue payload[0:0] = addresses.encodeVarint(chunkCount) diff --git a/src/network/knownnodes.py b/src/network/knownnodes.py index 7d21400104..93ce0b9e8e 100644 --- a/src/network/knownnodes.py +++ b/src/network/knownnodes.py @@ -109,7 +109,11 @@ def addKnownNode(stream, peer, lastseen=None, is_self=False): """ # pylint: disable=too-many-branches if not isinstance(peer.host, str): - peer = Peer(peer.host.decode(), peer.port) + try: + peer = Peer(peer.host.decode('ascii'), peer.port) + except UnicodeDecodeError as err: + logger.warning("Invalid host: {}".format(peer.host.decode('ascii', 'backslashreplace'))) + return if isinstance(stream, Iterable): with knownNodesLock: for s in stream: diff --git a/src/network/objectracker.py b/src/network/objectracker.py index abaefad74f..dcea8d235b 100644 --- a/src/network/objectracker.py +++ b/src/network/objectracker.py @@ -3,6 +3,7 @@ """ import time from threading import RLock +from binascii import hexlify import state import network.connectionpool as connectionpool @@ -87,19 +88,21 @@ def hasObj(self, hashid): def handleReceivedInventory(self, hashId): """Handling received inventory""" + hex_hash = hexlify(hashId).decode('ascii') if haveBloom: - self.invBloom.add(hashId) + self.invBloom.add(hex_hash) try: with self.objectsNewToThemLock: - del self.objectsNewToThem[hashId] + del self.objectsNewToThem[hex_hash] except KeyError: pass - if hashId not in missingObjects: - missingObjects[hashId] = time.time() + if hex_hash not in missingObjects: + missingObjects[hex_hash] = time.time() self.objectsNewToMe[hashId] = True def handleReceivedObject(self, streamNumber, hashid): """Handling received object""" + hex_hash = hexlify(hashid).decode('ascii') for i in connectionpool.pool.connections(): if not i.fullyEstablished: continue @@ -110,7 +113,7 @@ def handleReceivedObject(self, streamNumber, hashid): not state.Dandelion.hasHash(hashid) or state.Dandelion.objectChildStem(hashid) == i): with i.objectsNewToThemLock: - i.objectsNewToThem[hashid] = time.time() + i.objectsNewToThem[hex_hash] = time.time() # update stream number, # which we didn't have when we just received the dinv # also resets expiration of the stem mode @@ -119,7 +122,7 @@ def handleReceivedObject(self, streamNumber, hashid): if i == self: try: with i.objectsNewToThemLock: - del i.objectsNewToThem[hashid] + del i.objectsNewToThem[hex_hash] except KeyError: pass self.objectsNewToMe.setLastObject() diff --git a/src/network/tcp.py b/src/network/tcp.py index 23866c9e2c..75768f2252 100644 --- a/src/network/tcp.py +++ b/src/network/tcp.py @@ -185,7 +185,7 @@ def endsWith(s, tail): return s.endswith(tail) except: try: - return s.decode().endswith(tail) + return s.decode('ascii').endswith(tail) except UnicodeDecodeError: return False diff --git a/src/protocol.py b/src/protocol.py index d1d2771fbd..eb2cc86f0c 100644 --- a/src/protocol.py +++ b/src/protocol.py @@ -487,7 +487,8 @@ def decryptAndCheckPubkeyPayload(data, address): encryptedData = data[readPosition:] # Let us try to decrypt the pubkey - toAddress, cryptorObject = state.neededPubkeys[tag] + hex_tag = 'tag-' + hexlify(tag).decode('ascii') + toAddress, cryptorObject = state.neededPubkeys[hex_tag] if toAddress != address: logger.critical( 'decryptAndCheckPubkeyPayload failed due to toAddress' diff --git a/src/randomtrackingdict.py b/src/randomtrackingdict.py index 5bf1918192..26a40e367a 100644 --- a/src/randomtrackingdict.py +++ b/src/randomtrackingdict.py @@ -3,6 +3,7 @@ """ from threading import RLock from time import time +from binascii import hexlify try: import helper_random @@ -38,10 +39,12 @@ def __len__(self): return self.len def __contains__(self, key): - return key in self.dictionary + hex_key = hexlify(key).decode('ascii') + return hex_key in self.dictionary def __getitem__(self, key): - return self.dictionary[key][1] + hex_key = hexlify(key).decode('ascii') + return self.dictionary[hex_key][1] def _swap(self, i1, i2): with self.lock: @@ -49,26 +52,30 @@ def _swap(self, i1, i2): key2 = self.indexDict[i2] self.indexDict[i1] = key2 self.indexDict[i2] = key1 - self.dictionary[key1][0] = i2 - self.dictionary[key2][0] = i1 + hex_key1 = hexlify(key1).decode('ascii') + hex_key2 = hexlify(key2).decode('ascii') + self.dictionary[hex_key1][0] = i2 + self.dictionary[hex_key2][0] = i1 # for quick reassignment return i2 def __setitem__(self, key, value): with self.lock: - if key in self.dictionary: - self.dictionary[key][1] = value + hex_key = hexlify(key).decode('ascii') + if hex_key in self.dictionary: + self.dictionary[hex_key][1] = value else: self.indexDict.append(key) - self.dictionary[key] = [self.len, value] + self.dictionary[hex_key] = [self.len, value] self._swap(self.len, self.len - self.pendingLen) self.len += 1 def __delitem__(self, key): - if key not in self.dictionary: + hex_key = hexlify(key).decode('ascii') + if hex_key not in self.dictionary: raise KeyError with self.lock: - index = self.dictionary[key][0] + index = self.dictionary[hex_key][0] # not pending if index < self.len - self.pendingLen: # left of pending part @@ -82,7 +89,7 @@ def __delitem__(self, key): # operation can improve 4x, but it's already very fast so we'll # ignore it for the time being del self.indexDict[-1] - del self.dictionary[key] + del self.dictionary[hex_key] self.len -= 1 def setMaxPending(self, maxPending): diff --git a/src/shared.py b/src/shared.py index b85ddb203f..c1099c00c1 100644 --- a/src/shared.py +++ b/src/shared.py @@ -114,11 +114,13 @@ def reloadMyAddressHashes(): if len(privEncryptionKey) == 64: myECCryptorObjects[hashobj] = \ highlevelcrypto.makeCryptor(privEncryptionKey) - myAddressesByHash[hashobj] = addressInKeysFile + hex_hash = hexlify(hashobj).decode('ascii') + myAddressesByHash[hex_hash] = addressInKeysFile tag = highlevelcrypto.double_sha512( encodeVarint(addressVersionNumber) + encodeVarint(streamNumber) + hashobj)[32:] - myAddressesByTag[tag] = addressInKeysFile + hex_tag = hexlify(tag).decode('ascii') + myAddressesByTag[hex_tag] = addressInKeysFile if not keyfileSecure: fixSensitiveFilePermissions(os.path.join( diff --git a/src/storage/filesystem.py b/src/storage/filesystem.py index e756a82016..531c80f5ab 100644 --- a/src/storage/filesystem.py +++ b/src/storage/filesystem.py @@ -70,7 +70,7 @@ def __setitem__(self, hashval, value): os.makedirs(os.path.join( self.baseDir, FilesystemInventory.objectDir, - hexlify(hashval).decode())) + hexlify(hashval).decode('ascii'))) except OSError: pass try: @@ -78,7 +78,7 @@ def __setitem__(self, hashval, value): os.path.join( self.baseDir, FilesystemInventory.objectDir, - hexlify(hashval).decode(), + hexlify(hashval).decode('ascii'), FilesystemInventory.metadataFilename, ), "w", @@ -87,12 +87,12 @@ def __setitem__(self, hashval, value): value.type, value.stream, value.expires, - hexlify(value.tag).decode())) + hexlify(value.tag).decode('ascii'))) with open( os.path.join( self.baseDir, FilesystemInventory.objectDir, - hexlify(hashval).decode(), + hexlify(hashval).decode('ascii'), FilesystemInventory.dataFilename, ), "wb", @@ -119,7 +119,7 @@ def delHashId(self, hashval): os.path.join( self.baseDir, FilesystemInventory.objectDir, - hexlify(hashval).decode(), + hexlify(hashval).decode('ascii'), FilesystemInventory.metadataFilename)) except IOError: pass @@ -128,7 +128,7 @@ def delHashId(self, hashval): os.path.join( self.baseDir, FilesystemInventory.objectDir, - hexlify(hashval).decode(), + hexlify(hashval).decode('ascii'), FilesystemInventory.dataFilename)) except IOError: pass @@ -136,7 +136,7 @@ def delHashId(self, hashval): os.rmdir(os.path.join( self.baseDir, FilesystemInventory.objectDir, - hexlify(hashval).decode())) + hexlify(hashval).decode('ascii'))) except IOError: pass @@ -186,7 +186,7 @@ def getData(self, hashId): os.path.join( self.baseDir, FilesystemInventory.objectDir, - hexlify(hashId).decode(), + hexlify(hashId).decode('ascii'), FilesystemInventory.dataFilename, ), "r", @@ -202,7 +202,7 @@ def getMetadata(self, hashId): os.path.join( self.baseDir, FilesystemInventory.objectDir, - hexlify(hashId).decode(), + hexlify(hashId).decode('ascii'), FilesystemInventory.metadataFilename, ), "r", diff --git a/src/storage/sqlite.py b/src/storage/sqlite.py index 385434e5dd..59700b60c4 100644 --- a/src/storage/sqlite.py +++ b/src/storage/sqlite.py @@ -4,6 +4,7 @@ import sqlite3 import time from threading import RLock +from binascii import hexlify, unhexlify from helper_sql import SqlBulkExecute, sqlExecute, sqlQuery from .storage import InventoryItem, InventoryStorage @@ -29,23 +30,24 @@ def __init__(self): def __contains__(self, hash_): with self.lock: - if hash_ in self._objects: + hex_hash = hexlify(hash_).decode('ascii') + if hex_hash in self._objects: return True rows = sqlQuery( - 'SELECT streamnumber FROM inventory WHERE hash=?', - sqlite3.Binary(hash_.encode())) + 'SELECT streamnumber FROM inventory WHERE hash=?', hash_) if not rows: return False - self._objects[hash_] = rows[0][0] + self._objects[hex_hash] = rows[0][0] return True def __getitem__(self, hash_): with self.lock: - if hash_ in self._inventory: - return self._inventory[hash_] + hex_hash = hexlify(hash_).decode('ascii') + if hex_hash in self._inventory: + return self._inventory[hex_hash] rows = sqlQuery( - b'SELECT objecttype, streamnumber, payload, expirestime, tag' - b' FROM inventory WHERE hash=?', sqlite3.Binary(hash_.encode())) + 'SELECT objecttype, streamnumber, payload, expirestime, tag' + ' FROM inventory WHERE hash=?', hash_) if not rows: raise KeyError(hash_) return InventoryItem(*rows[0]) @@ -53,16 +55,17 @@ def __getitem__(self, hash_): def __setitem__(self, hash_, value): with self.lock: value = InventoryItem(*value) - self._inventory[hash_] = value - self._objects[hash_] = value.stream + hex_hash = hexlify(hash_).decode('ascii') + self._inventory[hex_hash] = value + self._objects[hex_hash] = value.stream def __delitem__(self, hash_): raise NotImplementedError def __iter__(self): with self.lock: - hashes = self._inventory.keys()[:] - hashes += (x for x, in sqlQuery('SELECT hash FROM inventory')) + hashes = map(unhexlify, self._inventory.keys()[:]) + hashes += (unhexlify(x) for x, in sqlQuery('SELECT hash FROM inventory')) return hashes.__iter__() def __len__(self): @@ -80,7 +83,7 @@ def by_type_and_tag(self, objectType, tag=None): ' FROM inventory WHERE objecttype=?', objectType] if tag: query[0] += ' AND tag=?' - query.append(sqlite3.Binary(tag)) + query.append(tag) with self.lock: values = [ value for value in self._inventory.values() @@ -93,9 +96,9 @@ def unexpired_hashes_by_stream(self, stream): """Return unexpired inventory vectors filtered by stream""" with self.lock: t = int(time.time()) - hashes = [x for x, value in self._inventory.items() + hashes = [unhexlify(x) for x, value in self._inventory.items() if value.stream == stream and value.expires > t] - hashes += (str(payload) for payload, in sqlQuery( + hashes += (payload for payload, in sqlQuery( 'SELECT hash FROM inventory WHERE streamnumber=?' ' AND expirestime>?', stream, t)) return hashes @@ -109,7 +112,7 @@ def flush(self): for objectHash, value in self._inventory.items(): sql.execute( 'INSERT INTO inventory VALUES (?, ?, ?, ?, ?, ?)', - sqlite3.Binary(objectHash), *value) + unhexlify(objectHash), *value) self._inventory.clear() def clean(self): diff --git a/src/tests/test_api_thread.py b/src/tests/test_api_thread.py index 6e453b1923..beb818766d 100644 --- a/src/tests/test_api_thread.py +++ b/src/tests/test_api_thread.py @@ -82,12 +82,12 @@ def test_disseminate_preencrypted(self): proofofwork.init() self.assertEqual( unhexlify(self.api.disseminatePreparedObject( - hexlify(sample_object_data).decode())), + hexlify(sample_object_data).decode('ascii'))), calculateInventoryHash(sample_object_data)) update_object = b'\x00' * 8 + pack( '>Q', int(time.time() + 7200)) + sample_object_data[16:] invhash = unhexlify(self.api.disseminatePreEncryptedMsg( - hexlify(update_object).decode() + hexlify(update_object).decode('ascii') )) obj_type, obj_stream, obj_data = state.Inventory[invhash][:3] self.assertEqual(obj_type, 42) From 88b14977b83bc7294bf9aaa10929a3db4e6890c1 Mon Sep 17 00:00:00 2001 From: Kashiko Koibumi Date: Wed, 15 May 2024 09:37:11 +0900 Subject: [PATCH 06/32] fix decryption to work in Python 3 Messages can be received and viewed now. Remained problems: * Message sending is not working yet. --- src/bitmessageqt/__init__.py | 12 ++++++------ src/bitmessageqt/foldertree.py | 4 ++-- src/class_objectProcessor.py | 25 +++++++++++++------------ src/helper_bitcoin.py | 12 ++++++------ src/helper_msgcoding.py | 3 ++- src/protocol.py | 2 +- src/pyelliptic/cipher.py | 4 ++-- src/pyelliptic/ecc.py | 5 +++-- src/pyelliptic/hash.py | 2 +- src/shared.py | 6 ++++-- 10 files changed, 40 insertions(+), 35 deletions(-) diff --git a/src/bitmessageqt/__init__.py b/src/bitmessageqt/__init__.py index f612e48adc..7b684ff504 100644 --- a/src/bitmessageqt/__init__.py +++ b/src/bitmessageqt/__init__.py @@ -847,7 +847,7 @@ def appIndicatorShowOrHideWindow(self): else: self.show() self.setWindowState( - self.windowState() & ~QtCore.Qt.WindowMinimized | QtCore.Qt.WindowActive) + self.windowState() & ~QtCore.Qt.WindowState.WindowMinimized | QtCore.Qt.WindowState.WindowActive) self.raise_() self.activateWindow() @@ -1664,16 +1664,16 @@ def changeEvent(self, event): self.init_sent_popup_menu(False) self.ui.blackwhitelist.init_blacklist_popup_menu(False) if event.type() == QtCore.QEvent.Type.WindowStateChange: - if self.windowState() & QtCore.Qt.WindowMinimized: + if self.windowState() & QtCore.Qt.WindowState.WindowMinimized: if config.getboolean('bitmessagesettings', 'minimizetotray') and not 'darwin' in sys.platform: QtCore.QTimer.singleShot(0, self.appIndicatorHide) - elif event.oldState() & QtCore.Qt.WindowMinimized: + elif event.oldState() & QtCore.Qt.WindowState.WindowMinimized: # The window state has just been changed to # Normal/Maximised/FullScreen pass def __icon_activated(self, reason): - if reason == QtWidgets.QSystemTrayIcon.Trigger: + if reason == QtWidgets.QSystemTrayIcon.ActivationReason.Trigger: self.actionShow.setChecked(not self.actionShow.isChecked()) self.appIndicatorShowOrHideWindow() @@ -1756,7 +1756,7 @@ def calcTrayIcon(self, iconFileName, inboxUnreadCount): # choose font and calculate font parameters fontName = "Lucida" fontSize = 10 - font = QtGui.QFont(fontName, fontSize, QtGui.QFont.Bold) + font = QtGui.QFont(fontName, fontSize, QtGui.QFont.Weight.Bold) fontMetrics = QtGui.QFontMetrics(font) # text txt = str(inboxUnreadCount) @@ -4071,7 +4071,7 @@ def tableWidgetInboxItemClicked(self): messageTextedit.setCurrentFont(QtGui.QFont()) messageTextedit.setTextColor(QtGui.QColor()) - messageTextedit.setContent(message) + messageTextedit.setPlainText(message) def tableWidgetAddressBookItemChanged(self, item): if item.type == AccountMixin.CHAN: diff --git a/src/bitmessageqt/foldertree.py b/src/bitmessageqt/foldertree.py index 1f9c20be31..896b355d53 100644 --- a/src/bitmessageqt/foldertree.py +++ b/src/bitmessageqt/foldertree.py @@ -484,9 +484,9 @@ def data(self, role=QtCore.Qt.ItemDataRole.UserRole): """ data = super(MessageList_TimeWidget, self).data(role) if role == TimestampRole: - return int(data.toPyObject()) + return int(data) if role == QtCore.Qt.ItemDataRole.UserRole: - return str(data.toPyObject()) + return data.data() return data diff --git a/src/class_objectProcessor.py b/src/class_objectProcessor.py index 95c1f7e24f..5eda2aaac9 100644 --- a/src/class_objectProcessor.py +++ b/src/class_objectProcessor.py @@ -356,9 +356,9 @@ def processpubkey(self, data): ' Sanity check failed.') return readPosition += 4 - publicSigningKey = '\x04' + data[readPosition:readPosition + 64] + publicSigningKey = b'\x04' + data[readPosition:readPosition + 64] readPosition += 64 - publicEncryptionKey = '\x04' + data[readPosition:readPosition + 64] + publicEncryptionKey = b'\x04' + data[readPosition:readPosition + 64] readPosition += 64 specifiedNonceTrialsPerByteLength = decodeVarint( data[readPosition:readPosition + 10])[1] @@ -517,9 +517,9 @@ def processmsg(self, data): return readPosition += sendersStreamNumberLength readPosition += 4 - pubSigningKey = '\x04' + decryptedData[readPosition:readPosition + 64] + pubSigningKey = b'\x04' + decryptedData[readPosition:readPosition + 64] readPosition += 64 - pubEncryptionKey = '\x04' + decryptedData[readPosition:readPosition + 64] + pubEncryptionKey = b'\x04' + decryptedData[readPosition:readPosition + 64] readPosition += 64 if sendersAddressVersionNumber >= 3: requiredAverageProofOfWorkNonceTrialsPerByte, varintLength = \ @@ -568,7 +568,7 @@ def processmsg(self, data): readPosition += signatureLengthLength signature = decryptedData[ readPosition:readPosition + signatureLength] - signedData = data[8:20] + encodeVarint(1) + encodeVarint( + signedData = bytes(data[8:20]) + encodeVarint(1) + encodeVarint( streamNumberAsClaimedByMsg ) + decryptedData[:positionOfBottomOfAckData] @@ -803,11 +803,11 @@ def processbroadcast(self, data): # of the sender's address to verify that it was # encrypted by with their key rather than some # other key. - toRipe = key + toRipe = unhexlify(key) initialDecryptionSuccessful = True logger.info( 'EC decryption successful using key associated' - ' with ripe hash: %s', hexlify(key)) + ' with ripe hash: %s', key) except Exception: logger.debug( 'cryptorObject.decrypt Exception:', exc_info=True) @@ -820,13 +820,14 @@ def processbroadcast(self, data): elif broadcastVersion == 5: embeddedTag = data[readPosition:readPosition + 32] readPosition += 32 - if embeddedTag not in shared.MyECSubscriptionCryptorObjects: + hex_tag = hexlify(embeddedTag).decode('ascii') + if hex_tag not in shared.MyECSubscriptionCryptorObjects: logger.debug('We\'re not interested in this broadcast.') return # We are interested in this broadcast because of its tag. # We're going to add some more data which is signed further down. - signedData = data[8:readPosition] - cryptorObject = shared.MyECSubscriptionCryptorObjects[embeddedTag] + signedData = bytes(data[8:readPosition]) + cryptorObject = shared.MyECSubscriptionCryptorObjects[hex_tag] try: decryptedData = cryptorObject.decrypt(data[readPosition:]) logger.debug('EC decryption successful') @@ -866,10 +867,10 @@ def processbroadcast(self, data): ) readPosition += sendersStreamLength readPosition += 4 - sendersPubSigningKey = '\x04' + \ + sendersPubSigningKey = b'\x04' + \ decryptedData[readPosition:readPosition + 64] readPosition += 64 - sendersPubEncryptionKey = '\x04' + \ + sendersPubEncryptionKey = b'\x04' + \ decryptedData[readPosition:readPosition + 64] readPosition += 64 if sendersAddressVersion >= 3: diff --git a/src/helper_bitcoin.py b/src/helper_bitcoin.py index d4f1d10585..a51eaf9c72 100644 --- a/src/helper_bitcoin.py +++ b/src/helper_bitcoin.py @@ -19,17 +19,17 @@ def calculateBitcoinAddressFromPubkey(pubkey): sha = hashlib.new('sha256') sha.update(pubkey) ripe.update(sha.digest()) - ripeWithProdnetPrefix = '\x00' + ripe.digest() + ripeWithProdnetPrefix = b'\x00' + ripe.digest() checksum = hashlib.sha256(hashlib.sha256( ripeWithProdnetPrefix).digest()).digest()[:4] binaryBitcoinAddress = ripeWithProdnetPrefix + checksum numberOfZeroBytesOnBinaryBitcoinAddress = 0 - while binaryBitcoinAddress[0] == '\x00': + while binaryBitcoinAddress[0] == b'\x00': numberOfZeroBytesOnBinaryBitcoinAddress += 1 binaryBitcoinAddress = binaryBitcoinAddress[1:] base58encoded = arithmetic.changebase(binaryBitcoinAddress, 256, 58) - return "1" * numberOfZeroBytesOnBinaryBitcoinAddress + base58encoded + return b"1" * numberOfZeroBytesOnBinaryBitcoinAddress + base58encoded def calculateTestnetAddressFromPubkey(pubkey): @@ -43,14 +43,14 @@ def calculateTestnetAddressFromPubkey(pubkey): sha = hashlib.new('sha256') sha.update(pubkey) ripe.update(sha.digest()) - ripeWithProdnetPrefix = '\x6F' + ripe.digest() + ripeWithProdnetPrefix = b'\x6F' + ripe.digest() checksum = hashlib.sha256(hashlib.sha256( ripeWithProdnetPrefix).digest()).digest()[:4] binaryBitcoinAddress = ripeWithProdnetPrefix + checksum numberOfZeroBytesOnBinaryBitcoinAddress = 0 - while binaryBitcoinAddress[0] == '\x00': + while binaryBitcoinAddress[0] == b'\x00': numberOfZeroBytesOnBinaryBitcoinAddress += 1 binaryBitcoinAddress = binaryBitcoinAddress[1:] base58encoded = arithmetic.changebase(binaryBitcoinAddress, 256, 58) - return "1" * numberOfZeroBytesOnBinaryBitcoinAddress + base58encoded + return b"1" * numberOfZeroBytesOnBinaryBitcoinAddress + base58encoded diff --git a/src/helper_msgcoding.py b/src/helper_msgcoding.py index 05fa1c1b7a..478cc5cd65 100644 --- a/src/helper_msgcoding.py +++ b/src/helper_msgcoding.py @@ -142,7 +142,8 @@ def decodeExtended(self, data): def decodeSimple(self, data): """Handle simple encoding""" - bodyPositionIndex = string.find(data, '\nBody:') + data = data.decode('utf-8', 'backslashreplace') + bodyPositionIndex = data.find('\nBody:') if bodyPositionIndex > 1: subject = data[8:bodyPositionIndex] # Only save and show the first 500 characters of the subject. diff --git a/src/protocol.py b/src/protocol.py index eb2cc86f0c..41e39a7ccd 100644 --- a/src/protocol.py +++ b/src/protocol.py @@ -294,7 +294,7 @@ def isProofOfWorkSufficient( if TTL < 300: TTL = 300 POW, = unpack('>Q', highlevelcrypto.double_sha512( - data[:8] + hashlib.sha512(data[8:]).digest())[0:8]) + bytes(data[:8]) + hashlib.sha512(data[8:]).digest())[0:8]) return POW <= 2 ** 64 / ( nonceTrialsPerByte * ( len(data) + payloadLengthExtraBytes diff --git a/src/pyelliptic/cipher.py b/src/pyelliptic/cipher.py index af6c08ca81..2c2c54dac6 100644 --- a/src/pyelliptic/cipher.py +++ b/src/pyelliptic/cipher.py @@ -30,7 +30,7 @@ def __init__(self, key, iv, do, ciphername='aes-256-cbc'): self.ctx = OpenSSL.EVP_CIPHER_CTX_new() if do == 1 or do == 0: k = OpenSSL.malloc(key, len(key)) - IV = OpenSSL.malloc(iv, len(iv)) + IV = OpenSSL.malloc(bytes(iv), len(iv)) OpenSSL.EVP_CipherInit_ex( self.ctx, self.cipher.get_pointer(), 0, k, IV, do) else: @@ -59,7 +59,7 @@ def update(self, input): """Update result with more data""" i = OpenSSL.c_int(0) buffer = OpenSSL.malloc(b"", len(input) + self.cipher.get_blocksize()) - inp = OpenSSL.malloc(input, len(input)) + inp = OpenSSL.malloc(bytes(input), len(input)) if OpenSSL.EVP_CipherUpdate(self.ctx, OpenSSL.byref(buffer), OpenSSL.byref(i), inp, len(input)) == 0: raise Exception("[OpenSSL] EVP_CipherUpdate FAIL ...") diff --git a/src/pyelliptic/ecc.py b/src/pyelliptic/ecc.py index c670d02361..8f254561a2 100644 --- a/src/pyelliptic/ecc.py +++ b/src/pyelliptic/ecc.py @@ -7,6 +7,7 @@ from hashlib import sha512 from struct import pack, unpack +from ctypes import c_char_p from .cipher import Cipher from .hash import equals, hmac_sha256 @@ -218,8 +219,8 @@ def raw_get_ecdh_key(self, pubkey_x, pubkey_y): if other_key == 0: raise Exception("[OpenSSL] EC_KEY_new_by_curve_name FAIL ...") - other_pub_key_x = OpenSSL.BN_bin2bn(pubkey_x, len(pubkey_x), None) - other_pub_key_y = OpenSSL.BN_bin2bn(pubkey_y, len(pubkey_y), None) + other_pub_key_x = OpenSSL.BN_bin2bn(c_char_p(bytes(pubkey_x)), len(pubkey_x), None) + other_pub_key_y = OpenSSL.BN_bin2bn(c_char_p(bytes(pubkey_y)), len(pubkey_y), None) other_group = OpenSSL.EC_KEY_get0_group(other_key) other_pub_key = OpenSSL.EC_POINT_new(other_group) diff --git a/src/pyelliptic/hash.py b/src/pyelliptic/hash.py index 70c9a6ce8b..b133f447ff 100644 --- a/src/pyelliptic/hash.py +++ b/src/pyelliptic/hash.py @@ -38,7 +38,7 @@ def hmac_sha256(k, m): Compute the key and the message with HMAC SHA5256 """ key = OpenSSL.malloc(k, len(k)) - d = OpenSSL.malloc(m, len(m)) + d = OpenSSL.malloc(bytes(m), len(m)) md = OpenSSL.malloc(0, 32) i = OpenSSL.pointer(OpenSSL.c_int(0)) OpenSSL.HMAC(OpenSSL.EVP_sha256(), key, len(k), d, len(m), md, i) diff --git a/src/shared.py b/src/shared.py index c1099c00c1..48ac7c91cf 100644 --- a/src/shared.py +++ b/src/shared.py @@ -151,7 +151,8 @@ def reloadBroadcastSendersForWhichImWatching(): encodeVarint(addressVersionNumber) + encodeVarint(streamNumber) + hashobj ).digest()[:32] - MyECSubscriptionCryptorObjects[hashobj] = \ + hex_hash = hexlify(hashobj).decode('ascii') + MyECSubscriptionCryptorObjects[hex_hash] = \ highlevelcrypto.makeCryptor(hexlify(privEncryptionKey)) else: doubleHashOfAddressData = highlevelcrypto.double_sha512( @@ -160,7 +161,8 @@ def reloadBroadcastSendersForWhichImWatching(): ) tag = doubleHashOfAddressData[32:] privEncryptionKey = doubleHashOfAddressData[:32] - MyECSubscriptionCryptorObjects[tag] = \ + hex_tag = hexlify(tag).decode('ascii') + MyECSubscriptionCryptorObjects[hex_tag] = \ highlevelcrypto.makeCryptor(hexlify(privEncryptionKey)) From 4f0e34b4be1766cc88efcda2e581e14dd0e72cea Mon Sep 17 00:00:00 2001 From: Kashiko Koibumi Date: Wed, 15 May 2024 11:50:38 +0900 Subject: [PATCH 07/32] make message sending work in Python 3 --- src/class_singleWorker.py | 97 +++++++++++++++++++-------------------- src/helper_msgcoding.py | 8 +++- src/network/bmproto.py | 2 +- src/network/dandelion.py | 6 +-- src/network/invthread.py | 4 +- 5 files changed, 60 insertions(+), 57 deletions(-) diff --git a/src/class_singleWorker.py b/src/class_singleWorker.py index 6172aa1d3b..c57ab26b8b 100644 --- a/src/class_singleWorker.py +++ b/src/class_singleWorker.py @@ -150,38 +150,38 @@ def run(self): if command == 'sendmessage': try: self.sendMsg() - except: # noqa:E722 - self.logger.warning("sendMsg didn't work") + except Exception as ex: # noqa:E722 + self.logger.warning("sendMsg didn't work: {}".format(ex)) elif command == 'sendbroadcast': try: self.sendBroadcast() - except: # noqa:E722 - self.logger.warning("sendBroadcast didn't work") + except Exception as ex: # noqa:E722 + self.logger.warning("sendBroadcast didn't work: {}".format(ex)) elif command == 'doPOWForMyV2Pubkey': try: self.doPOWForMyV2Pubkey(data) - except: # noqa:E722 - self.logger.warning("doPOWForMyV2Pubkey didn't work") + except Exception as ex: # noqa:E722 + self.logger.warning("doPOWForMyV2Pubkey didn't work: {}".format(ex)) elif command == 'sendOutOrStoreMyV3Pubkey': try: self.sendOutOrStoreMyV3Pubkey(data) - except: # noqa:E722 - self.logger.warning("sendOutOrStoreMyV3Pubkey didn't work") + except Exception as ex: # noqa:E722 + self.logger.warning("sendOutOrStoreMyV3Pubkey didn't work: {}".format(ex)) elif command == 'sendOutOrStoreMyV4Pubkey': try: self.sendOutOrStoreMyV4Pubkey(data) - except: # noqa:E722 - self.logger.warning("sendOutOrStoreMyV4Pubkey didn't work") + except Exception as ex: # noqa:E722 + self.logger.warning("sendOutOrStoreMyV4Pubkey didn't work: {}".format(ex)) elif command == 'sendOnionPeerObj': try: self.sendOnionPeerObj(data) - except: # noqa:E722 - self.logger.warning("sendOnionPeerObj didn't work") + except Exception as ex: # noqa:E722 + self.logger.warning("sendOnionPeerObj didn't work: {}".format(ex)) elif command == 'resetPoW': try: proofofwork.resetPoW() - except: # noqa:E722 - self.logger.warning("proofofwork.resetPoW didn't work") + except Exception as ex: # noqa:E722 + self.logger.warning("proofofwork.resetPoW didn't work: {}".format(ex)) elif command == 'stopThread': self.busy = 0 return @@ -603,7 +603,7 @@ def sendBroadcast(self): TTL = int(TTL + helper_random.randomrandrange(-300, 300)) embeddedTime = int(time.time() + TTL) payload = pack('>Q', embeddedTime) - payload += '\x00\x00\x00\x03' # object type: broadcast + payload += b'\x00\x00\x00\x03' # object type: broadcast if addressVersionNumber <= 3: payload += encodeVarint(4) # broadcast version @@ -619,7 +619,7 @@ def sendBroadcast(self): tag = doubleHashOfAddressData[32:] payload += tag else: - tag = '' + tag = b'' dataToEncrypt = encodeVarint(addressVersionNumber) dataToEncrypt += encodeVarint(streamNumber) @@ -702,7 +702,7 @@ def sendBroadcast(self): tr._translate( "MainWindow", "Broadcast sent on %1" - ).arg(l10n.formatTimestamp())) + ).format(l10n.formatTimestamp())) )) # Update the status of the message in the 'sent' table to have @@ -792,7 +792,7 @@ def sendMsg(self): # We don't have the needed pubkey in the pubkeys table already. else: if toAddressVersionNumber <= 3: - toTag = '' + toTag = b'' else: toTag = highlevelcrypto.double_sha512( encodeVarint(toAddressVersionNumber) @@ -977,7 +977,7 @@ def sendMsg(self): " destination be included in the" " message but this is disallowed in" " your settings. %1" - ).arg(l10n.formatTimestamp())) + ).format(l10n.formatTimestamp())) )) # if the human changes their setting and then # sends another message or restarts their client, @@ -1042,14 +1042,13 @@ def sendMsg(self): tr._translate( "MainWindow", "Doing work necessary to send message.\n" - "Receiver\'s required difficulty: %1" - " and %2" - ).arg( + "Receiver\'s required difficulty: {0}" + " and {1}" + ).format( str( float(requiredAverageProofOfWorkNonceTrialsPerByte) / defaults.networkDefaultProofOfWorkNonceTrialsPerByte - ) - ).arg( + ), str( float(requiredPayloadLengthExtraBytes) / defaults.networkDefaultPayloadLengthExtraBytes @@ -1082,14 +1081,14 @@ def sendMsg(self): tr._translate( "MainWindow", "Problem: The work demanded by" - " the recipient (%1 and %2) is" + " the recipient ({0} and {1}) is" " more difficult than you are" - " willing to do. %3" - ).arg(str(float(requiredAverageProofOfWorkNonceTrialsPerByte) - / defaults.networkDefaultProofOfWorkNonceTrialsPerByte) - ).arg(str(float(requiredPayloadLengthExtraBytes) - / defaults.networkDefaultPayloadLengthExtraBytes) - ).arg(l10n.formatTimestamp())))) + " willing to do. {2}" + ).format(str(float(requiredAverageProofOfWorkNonceTrialsPerByte) + / defaults.networkDefaultProofOfWorkNonceTrialsPerByte), + str(float(requiredPayloadLengthExtraBytes) + / defaults.networkDefaultPayloadLengthExtraBytes), + l10n.formatTimestamp())))) continue else: # if we are sending a message to ourselves or a chan.. self.logger.info('Sending a message.') @@ -1110,8 +1109,8 @@ def sendMsg(self): " message to yourself or a chan but your" " encryption key could not be found in" " the keys.dat file. Could not encrypt" - " message. %1" - ).arg(l10n.formatTimestamp())) + " message. {0}" + ).format(l10n.formatTimestamp())) )) self.logger.error( 'Error within sendMsg. Could not read the keys' @@ -1208,14 +1207,14 @@ def sendMsg(self): 'Not bothering to include ackdata because we are' ' sending to ourselves or a chan.' ) - fullAckPayload = '' + fullAckPayload = b'' elif not protocol.checkBitfield( behaviorBitfield, protocol.BITFIELD_DOESACK): self.logger.info( 'Not bothering to include ackdata because' ' the receiver said that they won\'t relay it anyway.' ) - fullAckPayload = '' + fullAckPayload = b'' else: # The fullAckPayload is a normal msg protocol message # with the proof of work already completed that the @@ -1224,7 +1223,7 @@ def sendMsg(self): ackdata, toStreamNumber, TTL) payload += encodeVarint(len(fullAckPayload)) payload += fullAckPayload - dataToSign = pack('>Q', embeddedTime) + '\x00\x00\x00\x02' + \ + dataToSign = pack('>Q', embeddedTime) + b'\x00\x00\x00\x02' + \ encodeVarint(1) + encodeVarint(toStreamNumber) + payload signature = highlevelcrypto.sign( dataToSign, privSigningKeyHex, self.digestAlg) @@ -1234,10 +1233,10 @@ def sendMsg(self): # We have assembled the data that will be encrypted. try: encrypted = highlevelcrypto.encrypt( - payload, "04" + hexlify(pubEncryptionKeyBase256) + payload, b"04" + hexlify(pubEncryptionKeyBase256) ) - except: # noqa:E722 - self.logger.warning("highlevelcrypto.encrypt didn't work") + except Exception as ex: # noqa:E722 + self.logger.warning("highlevelcrypto.encrypt didn't work: {}".format(ex)) sqlExecute( '''UPDATE sent SET status='badkey' WHERE ackdata=? AND folder='sent' ''', ackdata @@ -1248,13 +1247,13 @@ def sendMsg(self): tr._translate( "MainWindow", "Problem: The recipient\'s encryption key is" - " no good. Could not encrypt message. %1" - ).arg(l10n.formatTimestamp())) + " no good. Could not encrypt message. {0}" + ).format(l10n.formatTimestamp())) )) continue encryptedPayload = pack('>Q', embeddedTime) - encryptedPayload += '\x00\x00\x00\x02' # object type: msg + encryptedPayload += b'\x00\x00\x00\x02' # object type: msg encryptedPayload += encodeVarint(1) # msg version encryptedPayload += encodeVarint(toStreamNumber) + encrypted target = 2 ** 64 / ( @@ -1288,8 +1287,8 @@ def sendMsg(self): time.time() - powStartTime, sizeof_fmt(nonce / (time.time() - powStartTime)) ) - except: # noqa:E722 - self.logger.warning("Proof of Work exception") + except Exception as ex: # noqa:E722 + self.logger.warning("Proof of Work exception: {}".format(ex)) encryptedPayload = pack('>Q', nonce) + encryptedPayload @@ -1317,7 +1316,7 @@ def sendMsg(self): tr._translate( "MainWindow", "Message sent. Sent at %1" - ).arg(l10n.formatTimestamp())))) + ).format(l10n.formatTimestamp())))) else: # not sending to a chan or one of my addresses queues.UISignalQueue.put(( @@ -1326,8 +1325,8 @@ def sendMsg(self): tr._translate( "MainWindow", "Message sent. Waiting for acknowledgement." - " Sent on %1" - ).arg(l10n.formatTimestamp())) + " Sent on {0}" + ).format(l10n.formatTimestamp())) )) self.logger.info( 'Broadcasting inv for my msg(within sendmsg function): %s', @@ -1437,7 +1436,7 @@ def requestPubKey(self, toAddress): TTL = TTL + helper_random.randomrandrange(-300, 300) embeddedTime = int(time.time() + TTL) payload = pack('>Q', embeddedTime) - payload += '\x00\x00\x00\x00' # object type: getpubkey + payload += b'\x00\x00\x00\x00' # object type: getpubkey payload += encodeVarint(addressVersionNumber) payload += encodeVarint(streamNumber) if addressVersionNumber <= 3: @@ -1492,7 +1491,7 @@ def requestPubKey(self, toAddress): "MainWindow", "Sending public key request. Waiting for reply." " Requested at %1" - ).arg(l10n.formatTimestamp())) + ).format(l10n.formatTimestamp())) )) def generateFullAckMessage(self, ackdata, _, TTL): diff --git a/src/helper_msgcoding.py b/src/helper_msgcoding.py index 478cc5cd65..225f352c86 100644 --- a/src/helper_msgcoding.py +++ b/src/helper_msgcoding.py @@ -71,12 +71,16 @@ def encodeExtended(self, message): def encodeSimple(self, message): """Handle simple encoding""" - self.data = 'Subject:%(subject)s\nBody:%(body)s' % message + data = 'Subject:%(subject)s\nBody:%(body)s' % message + self.data = data.encode('utf-8', 'backslashreplace') self.length = len(self.data) def encodeTrivial(self, message): """Handle trivial encoding""" - self.data = message['body'] + data = message['body'] + if isinstance(data, str): + data = data.encode('utf-8', 'backslashreplace') + self.data = data self.length = len(self.data) diff --git a/src/network/bmproto.py b/src/network/bmproto.py index 980b302232..317dbd8fd8 100644 --- a/src/network/bmproto.py +++ b/src/network/bmproto.py @@ -336,7 +336,7 @@ def bm_command_getdata(self): if now < self.skipUntil: return True for i in items: - self.pendingUpload[str(i)] = now + self.pendingUpload[i] = now return True def _command_inv(self, dandelion=False): diff --git a/src/network/dandelion.py b/src/network/dandelion.py index b5e6e49579..300ecc3124 100644 --- a/src/network/dandelion.py +++ b/src/network/dandelion.py @@ -6,7 +6,7 @@ from random import choice, expovariate, sample from threading import RLock from time import time -from binascii import hexlify +from binascii import hexlify, unhexlify import network.connectionpool as connectionpool import state @@ -113,7 +113,7 @@ def maybeAddStem(self, connection): }.items(): self.hashMap[k] = Stem( connection, v.stream, self.poissonTimeout()) - invQueue.put((v.stream, k, v.child)) + invQueue.put((v.stream, unhexlify(k), v.child)) def maybeRemoveStem(self, connection): """ @@ -174,7 +174,7 @@ def expire(self): with self.lock: deadline = time() toDelete = [ - [v.stream, k, v.child] for k, v in self.hashMap.items() + [v.stream, unhexlify(k), v.child] for k, v in self.hashMap.items() if v.timeout < deadline ] diff --git a/src/network/invthread.py b/src/network/invthread.py index 4eba920534..b212411334 100644 --- a/src/network/invthread.py +++ b/src/network/invthread.py @@ -92,13 +92,13 @@ def run(self): # pylint: disable=too-many-branches connection.append_write_buf(protocol.CreatePacket( b'inv', addresses.encodeVarint( - len(fluffs)) + ''.join(fluffs))) + len(fluffs)) + b''.join(fluffs))) if stems: random.shuffle(stems) connection.append_write_buf(protocol.CreatePacket( b'dinv', addresses.encodeVarint( - len(stems)) + ''.join(stems))) + len(stems)) + b''.join(stems))) invQueue.iterate() for _ in range(len(chunk)): From cdbe5f80e2b3686262ba785f33062f2ebc6c5b2a Mon Sep 17 00:00:00 2001 From: Kashiko Koibumi Date: Wed, 15 May 2024 12:41:50 +0900 Subject: [PATCH 08/32] fix exception from network status --- src/bitmessageqt/networkstatus.py | 4 ++-- src/network/dandelion.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/bitmessageqt/networkstatus.py b/src/bitmessageqt/networkstatus.py index ac84f5245a..32cb346902 100644 --- a/src/bitmessageqt/networkstatus.py +++ b/src/bitmessageqt/networkstatus.py @@ -195,9 +195,9 @@ def updateNetworkStatusTab(self, outbound, add, destination): if not connectionpool.pool.inboundConnections: self.window().setStatusIcon('yellow') for i in range(self.tableWidgetConnectionCount.rowCount()): - if self.tableWidgetConnectionCount.item(i, 0).data(QtCore.Qt.ItemDataRole.UserRole).toPyObject() != destination: + if self.tableWidgetConnectionCount.item(i, 0).data(QtCore.Qt.ItemDataRole.UserRole) != destination: continue - if self.tableWidgetConnectionCount.item(i, 1).data(QtCore.Qt.ItemDataRole.UserRole).toPyObject() == outbound: + if self.tableWidgetConnectionCount.item(i, 1).data(QtCore.Qt.ItemDataRole.UserRole) == outbound: self.tableWidgetConnectionCount.removeRow(i) break diff --git a/src/network/dandelion.py b/src/network/dandelion.py index 300ecc3124..1d5a997a65 100644 --- a/src/network/dandelion.py +++ b/src/network/dandelion.py @@ -189,8 +189,8 @@ def reRandomiseStems(self): try: # random two connections self.stem = sample( - connectionpool.BMConnectionPool( - ).outboundConnections.values(), MAX_STEMS) + sorted(connectionpool.BMConnectionPool( + ).outboundConnections.values()), MAX_STEMS) # not enough stems available except ValueError: self.stem = connectionpool.BMConnectionPool( From 2109fc0ab0c254515d5ce28862c19ea88c875c59 Mon Sep 17 00:00:00 2001 From: Kashiko Koibumi Date: Wed, 15 May 2024 13:01:32 +0900 Subject: [PATCH 09/32] fix sending v4 pubkey --- src/class_singleWorker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/class_singleWorker.py b/src/class_singleWorker.py index c57ab26b8b..e0d8a51816 100644 --- a/src/class_singleWorker.py +++ b/src/class_singleWorker.py @@ -417,7 +417,7 @@ def sendOutOrStoreMyV4Pubkey(self, myAddress): TTL = int(28 * 24 * 60 * 60 + helper_random.randomrandrange(-300, 300)) embeddedTime = int(time.time() + TTL) payload = pack('>Q', (embeddedTime)) - payload += '\x00\x00\x00\x01' # object type: pubkey + payload += b'\x00\x00\x00\x01' # object type: pubkey payload += encodeVarint(addressVersionNumber) # Address version number payload += encodeVarint(streamNumber) dataToEncrypt = protocol.getBitfield(myAddress) From ba9734e979962a172ff66d7ebbe75d5abc4931a2 Mon Sep 17 00:00:00 2001 From: Kashiko Koibumi Date: Wed, 15 May 2024 13:06:59 +0900 Subject: [PATCH 10/32] fix pubkey check It seems that one to one messaging using pubkey retrieving is not working yet. --- src/protocol.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/protocol.py b/src/protocol.py index 41e39a7ccd..b2103cd933 100644 --- a/src/protocol.py +++ b/src/protocol.py @@ -466,7 +466,7 @@ def decryptAndCheckPubkeyPayload(data, address): readPosition += varintLength # We'll store the address version and stream number # (and some more) in the pubkeys table. - storedData = data[20:readPosition] + storedData = bytes(data[20:readPosition]) if addressVersion != embeddedAddressVersion: logger.info( @@ -513,9 +513,9 @@ def decryptAndCheckPubkeyPayload(data, address): readPosition = 0 # bitfieldBehaviors = decryptedData[readPosition:readPosition + 4] readPosition += 4 - publicSigningKey = '\x04' + decryptedData[readPosition:readPosition + 64] + publicSigningKey = b'\x04' + decryptedData[readPosition:readPosition + 64] readPosition += 64 - publicEncryptionKey = '\x04' + decryptedData[readPosition:readPosition + 64] + publicEncryptionKey = b'\x04' + decryptedData[readPosition:readPosition + 64] readPosition += 64 specifiedNonceTrialsPerByteLength = decodeVarint( decryptedData[readPosition:readPosition + 10])[1] From 6a090e802eadc2d105ed57ce0a00a0e0806cdbc1 Mon Sep 17 00:00:00 2001 From: Kashiko Koibumi Date: Thu, 16 May 2024 02:56:36 +0900 Subject: [PATCH 11/32] fix some bugs related to the migration to Python3 Now getpubkey and one-to-one messaging works. --- src/class_objectProcessor.py | 18 +++++++++--------- src/network/dandelion.py | 5 ++--- src/protocol.py | 2 +- src/storage/sqlite.py | 2 +- 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/class_objectProcessor.py b/src/class_objectProcessor.py index 5eda2aaac9..a96b3295cf 100644 --- a/src/class_objectProcessor.py +++ b/src/class_objectProcessor.py @@ -153,8 +153,8 @@ def checkackdata(data): data[readPosition:], _translate( "MainWindow", - "Acknowledgement of the message received %1" - ).arg(l10n.formatTimestamp())) + "Acknowledgement of the message received {}" + ).format(l10n.formatTimestamp())) )) else: logger.debug('This object is not an acknowledgement bound for me.') @@ -214,11 +214,11 @@ def processgetpubkey(data): return logger.debug( 'The length of the requested hash is not 20 bytes.' ' Something is wrong. Ignoring.') + hex_hash = hexlify(requestedHash).decode('ascii') logger.info( 'the hash requested in this getpubkey request is: %s', - hexlify(requestedHash)) + hex_hash) # if this address hash is one of mine - hex_hash = hexlify(requestedHash).decode('ascii') if hex_hash in shared.myAddressesByHash: myAddress = shared.myAddressesByHash[hex_hash] elif requestedAddressVersionNumber >= 4: @@ -317,7 +317,7 @@ def processpubkey(self, data): dataToStore = data[20:readPosition] sha = hashlib.new('sha512') sha.update( - '\x04' + publicSigningKey + '\x04' + publicEncryptionKey) + b'\x04' + publicSigningKey + b'\x04' + publicEncryptionKey) ripe = RIPEMD160Hash(sha.digest()).digest() if logger.isEnabledFor(logging.DEBUG): @@ -808,9 +808,9 @@ def processbroadcast(self, data): logger.info( 'EC decryption successful using key associated' ' with ripe hash: %s', key) - except Exception: + except Exception as ex: logger.debug( - 'cryptorObject.decrypt Exception:', exc_info=True) + 'cryptorObject.decrypt Exception: {}'.format(ex)) if not initialDecryptionSuccessful: # This is not a broadcast I am interested in. return logger.debug( @@ -1062,8 +1062,8 @@ def ackDataHasAValidHeader(ackData): if checksum != hashlib.sha512(payload).digest()[0:4]: logger.info('ackdata checksum wrong. Not sending ackdata.') return False - command = command.rstrip('\x00') - if command != 'object': + command = command.rstrip(b'\x00') + if command != b'object': return False return True diff --git a/src/network/dandelion.py b/src/network/dandelion.py index 1d5a997a65..7d3d881b8d 100644 --- a/src/network/dandelion.py +++ b/src/network/dandelion.py @@ -74,13 +74,12 @@ def setHashStream(self, hashId, stream=1): def removeHash(self, hashId, reason="no reason specified"): """Switch inventory vector from stem to fluff mode""" + hex_hash = hexlify(hashId).decode('ascii') if logger.isEnabledFor(logging.DEBUG): logger.debug( - '%s entering fluff mode due to %s.', - ''.join('%02x' % ord(i) for i in hashId), reason) + '%s entering fluff mode due to %s.', hex_hash, reason) with self.lock: try: - hex_hash = hexlify(hashId).decode('ascii') del self.hashMap[hex_hash] except KeyError: pass diff --git a/src/protocol.py b/src/protocol.py index b2103cd933..93b4a35134 100644 --- a/src/protocol.py +++ b/src/protocol.py @@ -483,7 +483,7 @@ def decryptAndCheckPubkeyPayload(data, address): readPosition += 32 # the time through the tag. More data is appended onto # signedData below after the decryption. - signedData = data[8:readPosition] + signedData = bytes(data[8:readPosition]) encryptedData = data[readPosition:] # Let us try to decrypt the pubkey diff --git a/src/storage/sqlite.py b/src/storage/sqlite.py index 59700b60c4..1b07225792 100644 --- a/src/storage/sqlite.py +++ b/src/storage/sqlite.py @@ -65,7 +65,7 @@ def __delitem__(self, hash_): def __iter__(self): with self.lock: hashes = map(unhexlify, self._inventory.keys()[:]) - hashes += (unhexlify(x) for x, in sqlQuery('SELECT hash FROM inventory')) + hashes += (x for x, in sqlQuery('SELECT hash FROM inventory')) return hashes.__iter__() def __len__(self): From ec91d9f20c74e060b23ab9dd61606307ae6aff8c Mon Sep 17 00:00:00 2001 From: Kashiko Koibumi Date: Thu, 16 May 2024 10:26:11 +0900 Subject: [PATCH 12/32] fix HTML display such as URL, email address and image --- src/bitmessageqt/__init__.py | 22 ++--- src/bitmessageqt/bitmessageui.py | 48 ++++++---- src/bitmessageqt/bitmessageui.py.diff | 125 ++++++++++++++++++++------ src/bitmessageqt/messageview.py | 49 +++++----- src/bitmessageqt/safehtmlparser.py | 4 - 5 files changed, 163 insertions(+), 85 deletions(-) diff --git a/src/bitmessageqt/__init__.py b/src/bitmessageqt/__init__.py index 7b684ff504..a4aac2e831 100644 --- a/src/bitmessageqt/__init__.py +++ b/src/bitmessageqt/__init__.py @@ -1428,7 +1428,7 @@ def treeWidgetKeyPressEvent(self, event): # addressbook def addressbookKeyPressEvent(self, event): """Handle keypress event in addressbook widget""" - if event.key() == QtCore.Qt.Key_Delete: + if event.key() == QtCore.Qt.Key.Key_Delete: self.on_action_AddressBookDelete() else: return QtWidgets.QTableWidget.keyPressEvent( @@ -1445,7 +1445,7 @@ def textEditKeyPressEvent(self, event): def handleKeyPress(self, event, focus=None): """This method handles keypress events for all widgets on MyForm""" messagelist = self.getCurrentMessagelist() - if event.key() == QtCore.Qt.Key_Delete: + if event.key() == QtCore.Qt.Key.Key_Delete: if isinstance(focus, (MessageView, QtWidgets.QTableWidget)): folder = self.getCurrentFolder() if folder == "sent": @@ -1453,24 +1453,24 @@ def handleKeyPress(self, event, focus=None): else: self.on_action_InboxTrash() event.ignore() - elif QtWidgets.QApplication.queryKeyboardModifiers() == QtCore.Qt.NoModifier: - if event.key() == QtCore.Qt.Key_N: + elif QtWidgets.QApplication.queryKeyboardModifiers() == QtCore.Qt.KeyboardModifier.NoModifier: + if event.key() == QtCore.Qt.Key.Key_N: currentRow = messagelist.currentRow() if currentRow < messagelist.rowCount() - 1: messagelist.selectRow(currentRow + 1) event.ignore() - elif event.key() == QtCore.Qt.Key_P: + elif event.key() == QtCore.Qt.Key.Key_P: currentRow = messagelist.currentRow() if currentRow > 0: messagelist.selectRow(currentRow - 1) event.ignore() - elif event.key() == QtCore.Qt.Key_R: + elif event.key() == QtCore.Qt.Key.Key_R: if messagelist == self.ui.tableWidgetInboxChans: self.on_action_InboxReplyChan() else: self.on_action_InboxReply() event.ignore() - elif event.key() == QtCore.Qt.Key_C: + elif event.key() == QtCore.Qt.Key.Key_C: currentAddress = self.getCurrentAccount() if currentAddress: self.setSendFromComboBox(currentAddress) @@ -1482,7 +1482,7 @@ def handleKeyPress(self, event, focus=None): ) self.ui.lineEditTo.setFocus() event.ignore() - elif event.key() == QtCore.Qt.Key_F: + elif event.key() == QtCore.Qt.Key.Key_F: try: self.getCurrentSearchLine(retObj=True).setFocus() except AttributeError: @@ -2861,7 +2861,7 @@ def on_action_InboxMessageForceHtml(self): content = ' '.join(lines) # To keep the whitespace between lines content = shared.fixPotentiallyInvalidUTF8Data(content) content = content - textEdit.setHtml(QtCore.QString(content)) + textEdit.setHtml(content) def on_action_InboxMarkUnread(self): tableWidget = self.getCurrentMessagelist() @@ -2928,7 +2928,7 @@ def setSendFromComboBox(self, address=None): self.ui.comboBoxSendFrom, self.ui.comboBoxSendFromBroadcast ): for i in range(box.count()): - if str(box.itemData(i).toPyObject()) == address: + if box.itemData(i) == address: box.setCurrentIndex(i) break else: @@ -4071,7 +4071,7 @@ def tableWidgetInboxItemClicked(self): messageTextedit.setCurrentFont(QtGui.QFont()) messageTextedit.setTextColor(QtGui.QColor()) - messageTextedit.setPlainText(message) + messageTextedit.setContent(message) def tableWidgetAddressBookItemChanged(self, item): if item.type == AccountMixin.CHAN: diff --git a/src/bitmessageqt/bitmessageui.py b/src/bitmessageqt/bitmessageui.py index 139090b1b8..2d4ce3eea3 100644 --- a/src/bitmessageqt/bitmessageui.py +++ b/src/bitmessageqt/bitmessageui.py @@ -9,9 +9,11 @@ from PyQt6 import QtCore, QtGui, QtWidgets from bmconfigparser import config from .foldertree import AddressBookCompleter -from .blacklist import Blacklist +from .messageview import MessageView +from .messagecompose import MessageCompose import bitmessageqt.settingsmixin as settingsmixin from .networkstatus import NetworkStatus +from .blacklist import Blacklist class Ui_MainWindow(object): def setupUi(self, MainWindow): @@ -105,7 +107,7 @@ def setupUi(self, MainWindow): self.tableWidgetInbox.verticalHeader().setVisible(False) self.tableWidgetInbox.verticalHeader().setDefaultSectionSize(26) self.verticalLayout_7.addWidget(self.tableWidgetInbox) - self.textEditInboxMessage = QtWidgets.QTextEdit(parent=self.inbox) + self.textEditInboxMessage = MessageView(parent=self.inbox) self.textEditInboxMessage.setBaseSize(QtCore.QSize(0, 500)) self.textEditInboxMessage.setReadOnly(True) self.textEditInboxMessage.setObjectName("textEditInboxMessage") @@ -200,34 +202,42 @@ def setupUi(self, MainWindow): self.verticalLayout_5.addWidget(self.textEditMessage) self.gridLayout_8.addLayout(self.verticalLayout_5, 0, 0, 1, 1) self.tabWidgetSend.addTab(self.sendDirect, "") - self.tab_2 = QtWidgets.QWidget() - self.tab_2.setObjectName("tab_2") - self.gridLayout_9 = QtWidgets.QGridLayout(self.tab_2) + self.sendBroadcast = QtWidgets.QWidget() + self.sendBroadcast.setObjectName("sendBroadcast") + self.gridLayout_9 = QtWidgets.QGridLayout(self.sendBroadcast) self.gridLayout_9.setObjectName("gridLayout_9") - self.verticalLayout_6 = QtWidgets.QVBoxLayout() - self.verticalLayout_6.setObjectName("verticalLayout_6") + self.verticalSplitter_6 = settingsmixin.SSplitter() + self.verticalSplitter_6.setObjectName("verticalSplitter_6") + self.verticalSplitter_6.setOrientation(QtCore.Qt.Orientation.Vertical) self.gridLayout_5 = QtWidgets.QGridLayout() self.gridLayout_5.setObjectName("gridLayout_5") - self.label_8 = QtWidgets.QLabel(parent=self.tab_2) + self.label_8 = QtWidgets.QLabel(self.sendBroadcast) self.label_8.setObjectName("label_8") self.gridLayout_5.addWidget(self.label_8, 0, 0, 1, 1) - self.lineEditSubjectBroadcast = QtWidgets.QLineEdit(parent=self.tab_2) + self.lineEditSubjectBroadcast = QtWidgets.QLineEdit(self.sendBroadcast) self.lineEditSubjectBroadcast.setText("") self.lineEditSubjectBroadcast.setObjectName("lineEditSubjectBroadcast") self.gridLayout_5.addWidget(self.lineEditSubjectBroadcast, 1, 1, 1, 1) - self.label_7 = QtWidgets.QLabel(parent=self.tab_2) + self.label_7 = QtWidgets.QLabel(self.sendBroadcast) self.label_7.setObjectName("label_7") self.gridLayout_5.addWidget(self.label_7, 1, 0, 1, 1) - self.comboBoxSendFromBroadcast = QtWidgets.QComboBox(parent=self.tab_2) + self.comboBoxSendFromBroadcast = QtWidgets.QComboBox(self.sendBroadcast) self.comboBoxSendFromBroadcast.setMinimumSize(QtCore.QSize(300, 0)) self.comboBoxSendFromBroadcast.setObjectName("comboBoxSendFromBroadcast") self.gridLayout_5.addWidget(self.comboBoxSendFromBroadcast, 0, 1, 1, 1) - self.verticalLayout_6.addLayout(self.gridLayout_5) - self.textEditMessageBroadcast = QtWidgets.QTextEdit(parent=self.tab_2) + self.gridLayout_5_Widget = QtWidgets.QWidget() + self.gridLayout_5_Widget.setLayout(self.gridLayout_5) + self.verticalSplitter_6.addWidget(self.gridLayout_5_Widget) + self.textEditMessageBroadcast = MessageCompose(self.sendBroadcast) self.textEditMessageBroadcast.setObjectName("textEditMessageBroadcast") - self.verticalLayout_6.addWidget(self.textEditMessageBroadcast) - self.gridLayout_9.addLayout(self.verticalLayout_6, 0, 0, 1, 1) - self.tabWidgetSend.addTab(self.tab_2, "") + self.verticalSplitter_6.addWidget(self.textEditMessageBroadcast) + self.verticalSplitter_6.setStretchFactor(0, 0) + self.verticalSplitter_6.setStretchFactor(1, 1) + self.verticalSplitter_6.setCollapsible(0, False) + self.verticalSplitter_6.setCollapsible(1, False) + self.verticalSplitter_6.handle(1).setEnabled(False) + self.gridLayout_9.addWidget(self.verticalSplitter_6, 0, 0, 1, 1) + self.tabWidgetSend.addTab(self.sendBroadcast, "") self.verticalLayout.addWidget(self.tabWidgetSend) self.horizontalLayout_5 = QtWidgets.QHBoxLayout() self.horizontalLayout_5.setObjectName("horizontalLayout_5") @@ -351,7 +361,7 @@ def setupUi(self, MainWindow): self.tableWidgetInboxSubscriptions.verticalHeader().setVisible(False) self.tableWidgetInboxSubscriptions.verticalHeader().setDefaultSectionSize(26) self.verticalLayout_4.addWidget(self.tableWidgetInboxSubscriptions) - self.textEditInboxMessageSubscriptions = QtWidgets.QTextEdit(parent=self.subscriptions) + self.textEditInboxMessageSubscriptions = MessageView(parent=self.subscriptions) self.textEditInboxMessageSubscriptions.setBaseSize(QtCore.QSize(0, 500)) self.textEditInboxMessageSubscriptions.setReadOnly(True) self.textEditInboxMessageSubscriptions.setObjectName("textEditInboxMessageSubscriptions") @@ -428,7 +438,7 @@ def setupUi(self, MainWindow): self.tableWidgetInboxChans.verticalHeader().setVisible(False) self.tableWidgetInboxChans.verticalHeader().setDefaultSectionSize(26) self.verticalLayout_8.addWidget(self.tableWidgetInboxChans) - self.textEditInboxMessageChans = QtWidgets.QTextEdit(parent=self.chans) + self.textEditInboxMessageChans = MessageView(parent=self.chans) self.textEditInboxMessageChans.setBaseSize(QtCore.QSize(0, 500)) self.textEditInboxMessageChans.setReadOnly(True) self.textEditInboxMessageChans.setObjectName("textEditInboxMessageChans") @@ -600,7 +610,7 @@ def retranslateUi(self, MainWindow): "p, li { white-space: pre-wrap; }\n" "\n" "


")) - self.tabWidgetSend.setTabText(self.tabWidgetSend.indexOf(self.tab_2), _translate("MainWindow", "Send Message to your Subscribers")) + self.tabWidgetSend.setTabText(self.tabWidgetSend.indexOf(self.sendBroadcast), _translate("MainWindow", "Send Message to your Subscribers")) self.pushButtonTTL.setText(_translate("MainWindow", "TTL:")) self.pushButtonClear.setText(_translate("MainWindow", "Clear")) self.pushButtonSend.setText(_translate("MainWindow", "Send")) diff --git a/src/bitmessageqt/bitmessageui.py.diff b/src/bitmessageqt/bitmessageui.py.diff index abb13228fc..136b7c80ea 100644 --- a/src/bitmessageqt/bitmessageui.py.diff +++ b/src/bitmessageqt/bitmessageui.py.diff @@ -1,19 +1,30 @@ ---- bitmessageui.py.orig 2024-05-13 08:32:22.376971328 +0900 -+++ bitmessageui.py 2024-05-14 15:56:24.921713575 +0900 -@@ -7,7 +7,11 @@ +--- bitmessageui.py.orig 2024-05-16 08:36:50.513403227 +0900 ++++ bitmessageui.py 2024-05-16 11:17:05.028916782 +0900 +@@ -7,7 +7,13 @@ from PyQt6 import QtCore, QtGui, QtWidgets - +from bmconfigparser import config +from .foldertree import AddressBookCompleter -+from .blacklist import Blacklist ++from .messageview import MessageView ++from .messagecompose import MessageCompose +import bitmessageqt.settingsmixin as settingsmixin +from .networkstatus import NetworkStatus ++from .blacklist import Blacklist class Ui_MainWindow(object): def setupUi(self, MainWindow): -@@ -140,6 +144,11 @@ +@@ -101,7 +107,7 @@ + self.tableWidgetInbox.verticalHeader().setVisible(False) + self.tableWidgetInbox.verticalHeader().setDefaultSectionSize(26) + self.verticalLayout_7.addWidget(self.tableWidgetInbox) +- self.textEditInboxMessage = QtWidgets.QTextEdit(parent=self.inbox) ++ self.textEditInboxMessage = MessageView(parent=self.inbox) + self.textEditInboxMessage.setBaseSize(QtCore.QSize(0, 500)) + self.textEditInboxMessage.setReadOnly(True) + self.textEditInboxMessage.setObjectName("textEditInboxMessage") +@@ -140,6 +146,11 @@ self.tableWidgetAddressBook.horizontalHeader().setStretchLastSection(True) self.tableWidgetAddressBook.verticalHeader().setVisible(False) self.verticalLayout_2.addWidget(self.tableWidgetAddressBook) @@ -25,7 +36,7 @@ self.pushButtonAddAddressBook = QtWidgets.QPushButton(parent=self.send) self.pushButtonAddAddressBook.setMaximumSize(QtCore.QSize(200, 16777215)) self.pushButtonAddAddressBook.setObjectName("pushButtonAddAddressBook") -@@ -156,40 +165,41 @@ +@@ -156,68 +167,77 @@ self.verticalLayout.setObjectName("verticalLayout") self.tabWidgetSend = QtWidgets.QTabWidget(parent=self.send) self.tabWidgetSend.setObjectName("tabWidgetSend") @@ -74,11 +85,61 @@ self.verticalLayout_5.addWidget(self.textEditMessage) self.gridLayout_8.addLayout(self.verticalLayout_5, 0, 0, 1, 1) - self.tabWidgetSend.addTab(self.tab, "") +- self.tab_2 = QtWidgets.QWidget() +- self.tab_2.setObjectName("tab_2") +- self.gridLayout_9 = QtWidgets.QGridLayout(self.tab_2) + self.tabWidgetSend.addTab(self.sendDirect, "") - self.tab_2 = QtWidgets.QWidget() - self.tab_2.setObjectName("tab_2") - self.gridLayout_9 = QtWidgets.QGridLayout(self.tab_2) -@@ -263,6 +273,9 @@ ++ self.sendBroadcast = QtWidgets.QWidget() ++ self.sendBroadcast.setObjectName("sendBroadcast") ++ self.gridLayout_9 = QtWidgets.QGridLayout(self.sendBroadcast) + self.gridLayout_9.setObjectName("gridLayout_9") +- self.verticalLayout_6 = QtWidgets.QVBoxLayout() +- self.verticalLayout_6.setObjectName("verticalLayout_6") ++ self.verticalSplitter_6 = settingsmixin.SSplitter() ++ self.verticalSplitter_6.setObjectName("verticalSplitter_6") ++ self.verticalSplitter_6.setOrientation(QtCore.Qt.Orientation.Vertical) + self.gridLayout_5 = QtWidgets.QGridLayout() + self.gridLayout_5.setObjectName("gridLayout_5") +- self.label_8 = QtWidgets.QLabel(parent=self.tab_2) ++ self.label_8 = QtWidgets.QLabel(self.sendBroadcast) + self.label_8.setObjectName("label_8") + self.gridLayout_5.addWidget(self.label_8, 0, 0, 1, 1) +- self.lineEditSubjectBroadcast = QtWidgets.QLineEdit(parent=self.tab_2) ++ self.lineEditSubjectBroadcast = QtWidgets.QLineEdit(self.sendBroadcast) + self.lineEditSubjectBroadcast.setText("") + self.lineEditSubjectBroadcast.setObjectName("lineEditSubjectBroadcast") + self.gridLayout_5.addWidget(self.lineEditSubjectBroadcast, 1, 1, 1, 1) +- self.label_7 = QtWidgets.QLabel(parent=self.tab_2) ++ self.label_7 = QtWidgets.QLabel(self.sendBroadcast) + self.label_7.setObjectName("label_7") + self.gridLayout_5.addWidget(self.label_7, 1, 0, 1, 1) +- self.comboBoxSendFromBroadcast = QtWidgets.QComboBox(parent=self.tab_2) ++ self.comboBoxSendFromBroadcast = QtWidgets.QComboBox(self.sendBroadcast) + self.comboBoxSendFromBroadcast.setMinimumSize(QtCore.QSize(300, 0)) + self.comboBoxSendFromBroadcast.setObjectName("comboBoxSendFromBroadcast") + self.gridLayout_5.addWidget(self.comboBoxSendFromBroadcast, 0, 1, 1, 1) +- self.verticalLayout_6.addLayout(self.gridLayout_5) +- self.textEditMessageBroadcast = QtWidgets.QTextEdit(parent=self.tab_2) ++ self.gridLayout_5_Widget = QtWidgets.QWidget() ++ self.gridLayout_5_Widget.setLayout(self.gridLayout_5) ++ self.verticalSplitter_6.addWidget(self.gridLayout_5_Widget) ++ self.textEditMessageBroadcast = MessageCompose(self.sendBroadcast) + self.textEditMessageBroadcast.setObjectName("textEditMessageBroadcast") +- self.verticalLayout_6.addWidget(self.textEditMessageBroadcast) +- self.gridLayout_9.addLayout(self.verticalLayout_6, 0, 0, 1, 1) +- self.tabWidgetSend.addTab(self.tab_2, "") ++ self.verticalSplitter_6.addWidget(self.textEditMessageBroadcast) ++ self.verticalSplitter_6.setStretchFactor(0, 0) ++ self.verticalSplitter_6.setStretchFactor(1, 1) ++ self.verticalSplitter_6.setCollapsible(0, False) ++ self.verticalSplitter_6.setCollapsible(1, False) ++ self.verticalSplitter_6.handle(1).setEnabled(False) ++ self.gridLayout_9.addWidget(self.verticalSplitter_6, 0, 0, 1, 1) ++ self.tabWidgetSend.addTab(self.sendBroadcast, "") + self.verticalLayout.addWidget(self.tabWidgetSend) + self.horizontalLayout_5 = QtWidgets.QHBoxLayout() + self.horizontalLayout_5.setObjectName("horizontalLayout_5") +@@ -263,6 +283,9 @@ self.labelHumanFriendlyTTLDescription.setMaximumSize(QtCore.QSize(45, 16777215)) self.labelHumanFriendlyTTLDescription.setObjectName("labelHumanFriendlyTTLDescription") self.horizontalLayout_5.addWidget(self.labelHumanFriendlyTTLDescription) @@ -88,7 +149,16 @@ self.pushButtonSend = QtWidgets.QPushButton(parent=self.send) self.pushButtonSend.setMaximumSize(QtCore.QSize(16777215, 16777215)) self.pushButtonSend.setObjectName("pushButtonSend") -@@ -348,15 +361,15 @@ +@@ -338,7 +361,7 @@ + self.tableWidgetInboxSubscriptions.verticalHeader().setVisible(False) + self.tableWidgetInboxSubscriptions.verticalHeader().setDefaultSectionSize(26) + self.verticalLayout_4.addWidget(self.tableWidgetInboxSubscriptions) +- self.textEditInboxMessageSubscriptions = QtWidgets.QTextEdit(parent=self.subscriptions) ++ self.textEditInboxMessageSubscriptions = MessageView(parent=self.subscriptions) + self.textEditInboxMessageSubscriptions.setBaseSize(QtCore.QSize(0, 500)) + self.textEditInboxMessageSubscriptions.setReadOnly(True) + self.textEditInboxMessageSubscriptions.setObjectName("textEditInboxMessageSubscriptions") +@@ -348,15 +371,15 @@ icon6 = QtGui.QIcon() icon6.addPixmap(QtGui.QPixmap(":/newPrefix/images/subscriptions.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) self.tabWidget.addTab(self.subscriptions, icon6, "") @@ -108,7 +178,7 @@ self.treeWidgetChans.setMaximumSize(QtCore.QSize(200, 16777215)) self.treeWidgetChans.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) self.treeWidgetChans.setLineWidth(1) -@@ -368,7 +381,7 @@ +@@ -368,7 +391,7 @@ icon7.addPixmap(QtGui.QPixmap(":/newPrefix/images/can-icon-16px.png"), QtGui.QIcon.Mode.Selected, QtGui.QIcon.State.Off) self.treeWidgetChans.headerItem().setIcon(0, icon7) self.verticalLayout_17.addWidget(self.treeWidgetChans) @@ -117,7 +187,7 @@ self.pushButtonAddChan.setMaximumSize(QtCore.QSize(200, 16777215)) self.pushButtonAddChan.setObjectName("pushButtonAddChan") self.verticalLayout_17.addWidget(self.pushButtonAddChan) -@@ -377,10 +390,10 @@ +@@ -377,10 +400,10 @@ self.verticalLayout_8.setObjectName("verticalLayout_8") self.horizontalLayout_6 = QtWidgets.QHBoxLayout() self.horizontalLayout_6.setObjectName("horizontalLayout_6") @@ -130,7 +200,7 @@ self.inboxSearchOptionChans.setObjectName("inboxSearchOptionChans") self.inboxSearchOptionChans.addItem("") self.inboxSearchOptionChans.addItem("") -@@ -389,7 +402,7 @@ +@@ -389,7 +412,7 @@ self.inboxSearchOptionChans.addItem("") self.horizontalLayout_6.addWidget(self.inboxSearchOptionChans) self.verticalLayout_8.addLayout(self.horizontalLayout_6) @@ -139,16 +209,16 @@ self.tableWidgetInboxChans.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers) self.tableWidgetInboxChans.setAlternatingRowColors(True) self.tableWidgetInboxChans.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.ExtendedSelection) -@@ -415,7 +428,7 @@ +@@ -415,7 +438,7 @@ self.tableWidgetInboxChans.verticalHeader().setVisible(False) self.tableWidgetInboxChans.verticalHeader().setDefaultSectionSize(26) self.verticalLayout_8.addWidget(self.tableWidgetInboxChans) - self.textEditInboxMessageChans = QtWidgets.QTextEdit(parent=self.tab_3) -+ self.textEditInboxMessageChans = QtWidgets.QTextEdit(parent=self.chans) ++ self.textEditInboxMessageChans = MessageView(parent=self.chans) self.textEditInboxMessageChans.setBaseSize(QtCore.QSize(0, 500)) self.textEditInboxMessageChans.setReadOnly(True) self.textEditInboxMessageChans.setObjectName("textEditInboxMessageChans") -@@ -424,113 +437,20 @@ +@@ -424,113 +447,20 @@ self.gridLayout_4.addLayout(self.horizontalLayout_7, 0, 0, 1, 1) icon8 = QtGui.QIcon() icon8.addPixmap(QtGui.QPixmap(":/newPrefix/images/can-icon-16px.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) @@ -273,7 +343,7 @@ self.menubar = QtWidgets.QMenuBar(parent=MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 885, 27)) self.menubar.setObjectName("menubar") -@@ -550,6 +470,8 @@ +@@ -550,6 +480,8 @@ self.actionManageKeys = QtGui.QAction(parent=MainWindow) self.actionManageKeys.setCheckable(False) self.actionManageKeys.setEnabled(True) @@ -282,7 +352,7 @@ icon = QtGui.QIcon.fromTheme("dialog-password") self.actionManageKeys.setIcon(icon) self.actionManageKeys.setObjectName("actionManageKeys") -@@ -561,6 +483,10 @@ +@@ -561,6 +493,10 @@ icon = QtGui.QIcon.fromTheme("help-contents") self.actionHelp.setIcon(icon) self.actionHelp.setObjectName("actionHelp") @@ -293,7 +363,7 @@ self.actionAbout = QtGui.QAction(parent=MainWindow) icon = QtGui.QIcon.fromTheme("help-about") self.actionAbout.setIcon(icon) -@@ -584,17 +510,23 @@ +@@ -584,17 +520,23 @@ self.menuFile.addAction(self.actionManageKeys) self.menuFile.addAction(self.actionDeleteAllTrashedMessages) self.menuFile.addAction(self.actionRegenerateDeterministicAddresses) @@ -319,7 +389,7 @@ QtCore.QMetaObject.connectSlotsByName(MainWindow) MainWindow.setTabOrder(self.tableWidgetInbox, self.textEditInboxMessage) MainWindow.setTabOrder(self.textEditInboxMessage, self.comboBoxSendFrom) -@@ -603,12 +535,26 @@ +@@ -603,12 +545,26 @@ MainWindow.setTabOrder(self.lineEditSubject, self.textEditMessage) MainWindow.setTabOrder(self.textEditMessage, self.pushButtonSend) MainWindow.setTabOrder(self.pushButtonSend, self.pushButtonAddSubscription) @@ -352,7 +422,7 @@ def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate -@@ -646,7 +592,7 @@ +@@ -646,7 +602,7 @@ "p, li { white-space: pre-wrap; }\n" "\n" "


")) @@ -361,16 +431,19 @@ self.label_8.setText(_translate("MainWindow", "From:")) self.label_7.setText(_translate("MainWindow", "Subject:")) self.textEditMessageBroadcast.setHtml(_translate("MainWindow", "\n" -@@ -656,7 +602,7 @@ +@@ -654,9 +610,9 @@ + "p, li { white-space: pre-wrap; }\n" + "\n" "


")) - self.tabWidgetSend.setTabText(self.tabWidgetSend.indexOf(self.tab_2), _translate("MainWindow", "Send Message to your Subscribers")) +- self.tabWidgetSend.setTabText(self.tabWidgetSend.indexOf(self.tab_2), _translate("MainWindow", "Send Message to your Subscribers")) ++ self.tabWidgetSend.setTabText(self.tabWidgetSend.indexOf(self.sendBroadcast), _translate("MainWindow", "Send Message to your Subscribers")) self.pushButtonTTL.setText(_translate("MainWindow", "TTL:")) - self.labelHumanFriendlyTTLDescription.setText(_translate("MainWindow", "X days")) + self.pushButtonClear.setText(_translate("MainWindow", "Clear")) self.pushButtonSend.setText(_translate("MainWindow", "Send")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.send), _translate("MainWindow", "Send")) self.treeWidgetSubscriptions.headerItem().setText(0, _translate("MainWindow", "Subscriptions")) -@@ -694,28 +640,8 @@ +@@ -694,28 +650,8 @@ item.setText(_translate("MainWindow", "Subject")) item = self.tableWidgetInboxChans.horizontalHeaderItem(3) item.setText(_translate("MainWindow", "Received")) @@ -401,7 +474,7 @@ self.tabWidget.setTabText(self.tabWidget.indexOf(self.networkstatus), _translate("MainWindow", "Network Status")) self.menuFile.setTitle(_translate("MainWindow", "File")) self.menuSettings.setTitle(_translate("MainWindow", "Settings")) -@@ -726,8 +652,10 @@ +@@ -726,8 +662,10 @@ self.actionExit.setShortcut(_translate("MainWindow", "Ctrl+Q")) self.actionHelp.setText(_translate("MainWindow", "Help")) self.actionHelp.setShortcut(_translate("MainWindow", "F1")) diff --git a/src/bitmessageqt/messageview.py b/src/bitmessageqt/messageview.py index 6d1d220b75..350d0c7fe1 100644 --- a/src/bitmessageqt/messageview.py +++ b/src/bitmessageqt/messageview.py @@ -38,7 +38,7 @@ def resizeEvent(self, event): def mousePressEvent(self, event): """Mouse press button event handler""" - if event.button() == QtCore.Qt.LeftButton and self.html and self.html.has_html and self.cursorForPosition( + if event.button() == QtCore.Qt.MouseButton.LeftButton and self.html and self.html.has_html and self.cursorForPosition( event.pos()).block().blockNumber() == 0: if self.mode == MessageView.MODE_PLAIN: self.showHTML() @@ -52,11 +52,11 @@ def wheelEvent(self, event): # super will actually automatically take care of zooming super(MessageView, self).wheelEvent(event) if ( - QtGui.QApplication.queryKeyboardModifiers() & QtCore.Qt.ControlModifier - ) == QtCore.Qt.ControlModifier and event.orientation() == QtCore.Qt.Vertical: + QtWidgets.QApplication.queryKeyboardModifiers() & QtCore.Qt.KeyboardModifier.ControlModifier + ) == QtCore.Qt.KeyboardModifier.ControlModifier and event.orientation() == QtCore.Qt.Vertical: zoom = self.currentFont().pointSize() * 100 / self.defaultFontPointSize - QtGui.QApplication.activeWindow().statusBar().showMessage(_translate( - "MainWindow", "Zoom level %1%").arg(str(zoom))) + QtWidgets.QApplication.activeWindow().statusBar().showMessage(_translate( + "MainWindow", "Zoom level {0}%").format(str(zoom))) def setWrappingWidth(self, width=None): """Set word-wrapping width""" @@ -68,14 +68,15 @@ def setWrappingWidth(self, width=None): def confirmURL(self, link): """Show a dialog requesting URL opening confirmation""" if link.scheme() == "mailto": - window = QtGui.QApplication.activeWindow() + window = QtWidgets.QApplication.activeWindow() window.ui.lineEditTo.setText(link.path()) - if link.hasQueryItem("subject"): + query = QtCore.QUrlQuery(link) + if query.hasQueryItem("subject"): window.ui.lineEditSubject.setText( - link.queryItemValue("subject")) - if link.hasQueryItem("body"): + query.queryItemValue("subject")) + if query.hasQueryItem("body"): window.ui.textEditMessage.setText( - link.queryItemValue("body")) + query.queryItemValue("body")) window.setSendFromComboBox() window.ui.tabWidgetSend.setCurrentIndex(0) window.ui.tabWidget.setCurrentIndex( @@ -83,18 +84,18 @@ def confirmURL(self, link): ) window.ui.textEditMessage.setFocus() return - reply = QtGui.QMessageBox.warning( + reply = QtWidgets.QMessageBox.warning( self, - QtGui.QApplication.translate( + QtWidgets.QApplication.translate( "MessageView", "Follow external link"), - QtGui.QApplication.translate( + QtWidgets.QApplication.translate( "MessageView", - "The link \"%1\" will open in a browser. It may be a security risk, it could de-anonymise you" - " or download malicious data. Are you sure?").arg(unicode(link.toString())), - QtGui.QMessageBox.Yes, - QtGui.QMessageBox.No) - if reply == QtGui.QMessageBox.Yes: + "The link \"{0}\" will open in a browser. It may be a security risk, it could de-anonymise you" + " or download malicious data. Are you sure?").format(link.toString()), + QtWidgets.QMessageBox.StandardButton.Yes, + QtWidgets.QMessageBox.StandardButton.No) + if reply == QtWidgets.QMessageBox.StandardButton.Yes: QtGui.QDesktopServices.openUrl(link) def loadResource(self, restype, name): @@ -123,8 +124,8 @@ def lazyRender(self): pos = self.out.find(">", self.outpos) if pos > self.outpos: self.outpos = pos + 1 - cursor.movePosition(QtGui.QTextCursor.End, QtGui.QTextCursor.MoveAnchor) - cursor.insertHtml(QtCore.QString(self.out[startpos:self.outpos])) + cursor.movePosition(QtGui.QTextCursor.MoveOperation.End, QtGui.QTextCursor.MoveMode.MoveAnchor) + cursor.insertHtml(str(self.out[startpos:self.outpos])) self.verticalScrollBar().setValue(position) self.rendering = False @@ -133,9 +134,8 @@ def showPlain(self): self.mode = MessageView.MODE_PLAIN out = self.html.raw if self.html.has_html: - out = "
" + unicode( - QtGui.QApplication.translate( - "MessageView", "HTML detected, click here to display")) + "

" + out + out = "
" + QtWidgets.QApplication.translate( + "MessageView", "HTML detected, click here to display") + "

" + out self.out = out self.outpos = 0 self.setHtml("") @@ -145,8 +145,7 @@ def showHTML(self): """Render message as HTML""" self.mode = MessageView.MODE_HTML out = self.html.sanitised - out = "
" + unicode( - QtGui.QApplication.translate("MessageView", "Click here to disable HTML")) + "

" + out + out = "
" + QtWidgets.QApplication.translate("MessageView", "Click here to disable HTML") + "

" + out self.out = out self.outpos = 0 self.setHtml("") diff --git a/src/bitmessageqt/safehtmlparser.py b/src/bitmessageqt/safehtmlparser.py index 853fd03103..98122398be 100644 --- a/src/bitmessageqt/safehtmlparser.py +++ b/src/bitmessageqt/safehtmlparser.py @@ -122,10 +122,6 @@ def handle_entityref(self, name): self.sanitised += "&" + name + ";" def feed(self, data): - try: - data = unicode(data, 'utf-8') - except UnicodeDecodeError: - data = unicode(data, 'utf-8', errors='replace') HTMLParser.feed(self, data) tmp = SafeHTMLParser.replace_pre(data) tmp = self.uriregex1.sub(r'\1', tmp) From 1b3ce71f199b8a672abfd3a9a13b916bd9f926fa Mon Sep 17 00:00:00 2001 From: Kashiko Koibumi Date: Thu, 16 May 2024 23:45:10 +0900 Subject: [PATCH 13/32] use bytes for key of hashtable in replacement of hexlified string --- src/api.py | 2 +- src/bitmessageqt/__init__.py | 2 +- src/class_addressGenerator.py | 14 +++++----- src/class_objectProcessor.py | 48 +++++++++++++++++------------------ src/class_singleWorker.py | 41 +++++++++++++----------------- src/network/bmproto.py | 37 +++++++++++---------------- src/network/dandelion.py | 28 +++++++++----------- src/network/downloadthread.py | 4 +-- src/network/objectracker.py | 24 +++++++++--------- src/protocol.py | 3 +-- src/randomtrackingdict.py | 28 +++++++++----------- src/shared.py | 12 +++------ src/storage/filesystem.py | 18 ++++++------- src/storage/sqlite.py | 25 +++++++++--------- src/tests/test_api_thread.py | 4 +-- 15 files changed, 130 insertions(+), 160 deletions(-) diff --git a/src/api.py b/src/api.py index 656564c12a..a444556951 100644 --- a/src/api.py +++ b/src/api.py @@ -1347,7 +1347,7 @@ def HandleDisseminatePreparedObject( 'Broadcasting inv for msg(API disseminatePreEncryptedMsg' ' command): %s', hexlify(inventoryHash)) queues.invQueue.put((toStreamNumber, inventoryHash)) - return hexlify(inventoryHash).decode('ascii') + return hexlify(inventoryHash).decode() @command('trashSentMessageByAckData') def HandleTrashSentMessageByAckDAta(self, ackdata): diff --git a/src/bitmessageqt/__init__.py b/src/bitmessageqt/__init__.py index a4aac2e831..aaf2f24319 100644 --- a/src/bitmessageqt/__init__.py +++ b/src/bitmessageqt/__init__.py @@ -1769,7 +1769,7 @@ def calcTrayIcon(self, iconFileName, inboxUnreadCount): if rect.width() > 20: txt = "+" fontSize = 15 - font = QtGui.QFont(fontName, fontSize, QtGui.QFont.Bold) + font = QtGui.QFont(fontName, fontSize, QtGui.QFont.Weight.Bold) fontMetrics = QtGui.QFontMetrics(font) rect = fontMetrics.boundingRect(txt) # draw text diff --git a/src/class_addressGenerator.py b/src/class_addressGenerator.py index 58e33badb7..800ea241de 100644 --- a/src/class_addressGenerator.py +++ b/src/class_addressGenerator.py @@ -172,10 +172,10 @@ def run(self): config.set(address, 'payloadlengthextrabytes', str( payloadLengthExtraBytes)) config.set( - address, 'privsigningkey', privSigningKeyWIF.decode('ascii')) + address, 'privsigningkey', privSigningKeyWIF.decode()) config.set( address, 'privencryptionkey', - privEncryptionKeyWIF.decode('ascii')) + privEncryptionKeyWIF.decode()) config.save() # The API and the join and create Chan functionality @@ -325,10 +325,10 @@ def run(self): str(payloadLengthExtraBytes)) config.set( address, 'privsigningkey', - privSigningKeyWIF.decode('ascii')) + privSigningKeyWIF.decode()) config.set( address, 'privencryptionkey', - privEncryptionKeyWIF.decode('ascii')) + privEncryptionKeyWIF.decode()) config.save() queues.UISignalQueue.put(( @@ -340,14 +340,12 @@ def run(self): shared.myECCryptorObjects[ripe] = \ highlevelcrypto.makeCryptor( hexlify(potentialPrivEncryptionKey)) - hex_ripe = hexlify(ripe).decode('ascii') - shared.myAddressesByHash[hex_ripe] = address + shared.myAddressesByHash[bytes(ripe)] = address tag = highlevelcrypto.double_sha512( encodeVarint(addressVersionNumber) + encodeVarint(streamNumber) + ripe )[32:] - hex_tag = hexlify(tag).decode('ascii') - shared.myAddressesByTag[hex_tag] = address + shared.myAddressesByTag[bytes(tag)] = address if addressVersionNumber == 3: # If this is a chan address, # the worker thread won't send out diff --git a/src/class_objectProcessor.py b/src/class_objectProcessor.py index a96b3295cf..1a71f929d6 100644 --- a/src/class_objectProcessor.py +++ b/src/class_objectProcessor.py @@ -141,10 +141,10 @@ def checkackdata(data): # bypass nonce and time, retain object type/version/stream + body readPosition = 16 - hex_data = hexlify(data[readPosition:]).decode('ascii') - if hex_data in state.ackdataForWhichImWatching: + data_bytes = bytes(data[readPosition:]) + if data_bytes in state.ackdataForWhichImWatching: logger.info('This object is an acknowledgement bound for me.') - del state.ackdataForWhichImWatching[hex_data] + del state.ackdataForWhichImWatching[data_bytes] sqlExecute( "UPDATE sent SET status='ackreceived', lastactiontime=?" " WHERE ackdata=?", int(time.time()), data[readPosition:]) @@ -214,24 +214,25 @@ def processgetpubkey(data): return logger.debug( 'The length of the requested hash is not 20 bytes.' ' Something is wrong. Ignoring.') - hex_hash = hexlify(requestedHash).decode('ascii') logger.info( 'the hash requested in this getpubkey request is: %s', - hex_hash) + hexlify(requestedHash).decode()) + requestedHash_bytes = bytes(requestedHash) # if this address hash is one of mine - if hex_hash in shared.myAddressesByHash: - myAddress = shared.myAddressesByHash[hex_hash] + if requestedHash_bytes in shared.myAddressesByHash: + myAddress = shared.myAddressesByHash[requestedHash_bytes] elif requestedAddressVersionNumber >= 4: requestedTag = data[readPosition:readPosition + 32] if len(requestedTag) != 32: return logger.debug( 'The length of the requested tag is not 32 bytes.' ' Something is wrong. Ignoring.') - hex_tag = hexlify(requestedTag).decode('ascii') logger.debug( - 'the tag requested in this getpubkey request is: %s', hex_tag) - if hex_tag in shared.myAddressesByTag: - myAddress = shared.myAddressesByTag[hex_tag] + 'the tag requested in this getpubkey request is: %s', + hexlify(requestedTag).decode()) + requestedTag_bytes = bytes(requestedTag) + if requestedTag_bytes in shared.myAddressesByTag: + myAddress = shared.myAddressesByTag[requestedTag_bytes] if myAddress == '': logger.info('This getpubkey request is not for any of my keys.') @@ -421,13 +422,13 @@ def processpubkey(self, data): ' Sanity check failed.') tag = data[readPosition:readPosition + 32] - hex_tag = 'tag-' + hexlify(tag).decode('ascii') - if hex_tag not in state.neededPubkeys: + tag_bytes = bytes(tag) + if tag_bytes not in state.neededPubkeys: return logger.info( 'We don\'t need this v4 pubkey. We didn\'t ask for it.') # Let us try to decrypt the pubkey - toAddress = state.neededPubkeys[hex_tag][0] + toAddress = state.neededPubkeys[tag_bytes][0] if protocol.decryptAndCheckPubkeyPayload(data, toAddress) == \ 'successful': # At this point we know that we have been waiting on this @@ -492,8 +493,7 @@ def processmsg(self, data): # This is a message bound for me. # Look up my address based on the RIPE hash. - hex_ripe = hexlify(toRipe).decode('ascii') - toAddress = shared.myAddressesByHash[hex_ripe] + toAddress = shared.myAddressesByHash[bytes(toRipe)] readPosition = 0 sendersAddressVersionNumber, sendersAddressVersionNumberLength = \ decodeVarint(decryptedData[readPosition:readPosition + 10]) @@ -803,11 +803,11 @@ def processbroadcast(self, data): # of the sender's address to verify that it was # encrypted by with their key rather than some # other key. - toRipe = unhexlify(key) + toRipe = key initialDecryptionSuccessful = True logger.info( 'EC decryption successful using key associated' - ' with ripe hash: %s', key) + ' with ripe hash: %s', hexlify(key).decode()) except Exception as ex: logger.debug( 'cryptorObject.decrypt Exception: {}'.format(ex)) @@ -820,14 +820,14 @@ def processbroadcast(self, data): elif broadcastVersion == 5: embeddedTag = data[readPosition:readPosition + 32] readPosition += 32 - hex_tag = hexlify(embeddedTag).decode('ascii') - if hex_tag not in shared.MyECSubscriptionCryptorObjects: + embeddedTag_bytes = bytes(embeddedTag) + if embeddedTag_bytes not in shared.MyECSubscriptionCryptorObjects: logger.debug('We\'re not interested in this broadcast.') return # We are interested in this broadcast because of its tag. # We're going to add some more data which is signed further down. signedData = bytes(data[8:readPosition]) - cryptorObject = shared.MyECSubscriptionCryptorObjects[hex_tag] + cryptorObject = shared.MyECSubscriptionCryptorObjects[embeddedTag_bytes] try: decryptedData = cryptorObject.decrypt(data[readPosition:]) logger.debug('EC decryption successful') @@ -1011,9 +1011,9 @@ def possibleNewPubkey(self, address): encodeVarint(addressVersion) + encodeVarint(streamNumber) + ripe )[32:] - hex_tag = 'tag-' + hexlify(tag).decode('ascii') - if hex_tag in state.neededPubkeys: - del state.neededPubkeys[hex_tag] + tag_bytes = bytes(tag) + if tag_bytes in state.neededPubkeys: + del state.neededPubkeys[tag_bytes] self.sendMessages(address) @staticmethod diff --git a/src/class_singleWorker.py b/src/class_singleWorker.py index e0d8a51816..7a41f3c1b4 100644 --- a/src/class_singleWorker.py +++ b/src/class_singleWorker.py @@ -87,8 +87,7 @@ def run(self): tag = doubleHashOfAddressData[32:] # We'll need this for when we receive a pubkey reply: # it will be encrypted and we'll need to decrypt it. - hex_tag = 'tag-' + hexlify(tag).decode('ascii') - state.neededPubkeys[hex_tag] = ( + state.neededPubkeys[bytes(tag)] = ( toAddress, highlevelcrypto.makeCryptor( hexlify(privEncryptionKey)) @@ -99,23 +98,20 @@ def run(self): '''SELECT ackdata FROM sent WHERE status = 'msgsent' AND folder = 'sent' ''') for row in queryreturn: ackdata, = row - self.logger.info('Watching for ackdata %s', hexlify(ackdata)) - hex_ackdata = hexlify(ackdata).decode('ascii') - state.ackdataForWhichImWatching[hex_ackdata] = 0 + self.logger.info('Watching for ackdata %s', hexlify(ackdata).decode()) + state.ackdataForWhichImWatching[bytes(ackdata)] = 0 # Fix legacy (headerless) watched ackdata to include header - for hex_oldack in state.ackdataForWhichImWatching: - oldack = unhexlify(hex_oldack) + for oldack in state.ackdataForWhichImWatching: if len(oldack) == 32: # attach legacy header, always constant (msg/1/1) newack = b'\x00\x00\x00\x02\x01\x01' + oldack - hex_newack = hexlify(newack).decode('ascii') - state.ackdataForWhichImWatching[hex_newack] = 0 + state.ackdataForWhichImWatching[bytes(newack)] = 0 sqlExecute( '''UPDATE sent SET ackdata=? WHERE ackdata=? AND folder = 'sent' ''', newack, oldack ) - del state.ackdataForWhichImWatching[hex_oldack] + del state.ackdataForWhichImWatching[oldack] # For the case if user deleted knownnodes # but is still having onionpeer objects in inventory @@ -701,7 +697,7 @@ def sendBroadcast(self): ackdata, tr._translate( "MainWindow", - "Broadcast sent on %1" + "Broadcast sent on {0}" ).format(l10n.formatTimestamp())) )) @@ -798,9 +794,9 @@ def sendMsg(self): encodeVarint(toAddressVersionNumber) + encodeVarint(toStreamNumber) + toRipe )[32:] - hex_tag = 'tag-' + hexlify(toTag).decode('ascii') + toTag_bytes = bytes(toTag) if toaddress in state.neededPubkeys or \ - hex_tag in state.neededPubkeys: + toTag_bytes in state.neededPubkeys: # We already sent a request for the pubkey sqlExecute( '''UPDATE sent SET status='awaitingpubkey', ''' @@ -841,8 +837,8 @@ def sendMsg(self): privEncryptionKey = doubleHashOfToAddressData[:32] # The second half of the sha512 hash. tag = doubleHashOfToAddressData[32:] - hex_tag = 'tag-' + hexlify(tag).decode('ascii') - state.neededPubkeys[hex_tag] = ( + tag_bytes = bytes(tag) + state.neededPubkeys[tag_bytes] = ( toaddress, highlevelcrypto.makeCryptor( hexlify(privEncryptionKey)) @@ -865,7 +861,7 @@ def sendMsg(self): ''' status='doingpubkeypow') AND ''' ''' folder='sent' ''', toaddress) - del state.neededPubkeys[hex_tag] + del state.neededPubkeys[tag_bytes] break # else: # There was something wrong with this @@ -907,8 +903,7 @@ def sendMsg(self): # if we aren't sending this to ourselves or a chan if not config.has_section(toaddress): - hex_ackdata = hexlify(ackdata).decode('ascii') - state.ackdataForWhichImWatching[hex_ackdata] = 0 + state.ackdataForWhichImWatching[bytes(ackdata)] = 0 queues.UISignalQueue.put(( 'updateSentItemStatusByAckdata', ( ackdata, @@ -976,7 +971,7 @@ def sendMsg(self): " device who requests that the" " destination be included in the" " message but this is disallowed in" - " your settings. %1" + " your settings. {0}" ).format(l10n.formatTimestamp())) )) # if the human changes their setting and then @@ -1315,7 +1310,7 @@ def sendMsg(self): ackdata, tr._translate( "MainWindow", - "Message sent. Sent at %1" + "Message sent. Sent at {0}" ).format(l10n.formatTimestamp())))) else: # not sending to a chan or one of my addresses @@ -1418,11 +1413,11 @@ def requestPubKey(self, toAddress): privEncryptionKey = doubleHashOfAddressData[:32] # Note that this is the second half of the sha512 hash. tag = doubleHashOfAddressData[32:] - hex_tag = 'tag-' + hexlify(tag).decode('ascii') - if hex_tag not in state.neededPubkeys: + tag_bytes = bytes(tag) + if tag_bytes not in state.neededPubkeys: # We'll need this for when we receive a pubkey reply: # it will be encrypted and we'll need to decrypt it. - state.neededPubkeys[hex_tag] = ( + state.neededPubkeys[tag_bytes] = ( toAddress, highlevelcrypto.makeCryptor(hexlify(privEncryptionKey)) ) diff --git a/src/network/bmproto.py b/src/network/bmproto.py index 317dbd8fd8..4ef131d8cb 100644 --- a/src/network/bmproto.py +++ b/src/network/bmproto.py @@ -9,7 +9,6 @@ import socket import struct import time -from binascii import hexlify # magic imports! import addresses @@ -111,16 +110,16 @@ def state_bm_command(self): # pylint: disable=too-many-branches b"error", b"version", b"verack"): logger.error( 'Received command %s before connection was fully' - ' established, ignoring', self.command.decode('ascii', 'backslashreplace')) + ' established, ignoring', self.command.decode('utf-8', 'replace')) self.invalid = True if not self.invalid: try: retval = getattr( - self, "bm_command_" + self.command.decode('ascii', 'backslashreplace').lower())() + self, "bm_command_" + self.command.decode('utf-8', 'replace').lower())() except AttributeError as err: - logger.debug('command = {}, err = {}'.format(self.command, err)) + logger.debug('command = {}, err = {}'.format(self.command.decode('utf-8', 'replace'), err)) # unimplemented command - logger.debug('unimplemented command %s', self.command.decode('ascii', 'backslashreplace')) + logger.debug('unimplemented command %s', self.command.decode('utf-8', 'replace')) except BMProtoInsufficientDataError: logger.debug('packet length too short, skipping') except BMProtoExcessiveDataError: @@ -143,8 +142,8 @@ def state_bm_command(self): # pylint: disable=too-many-branches # broken read, ignore pass else: - logger.debug('Closing due to invalid command %s', self.command.decode('ascii', 'backslashreplace')) - self.close_reason = "Invalid command %s" % self.command.decode('ascii', 'backslashreplace') + logger.debug('Closing due to invalid command %s', self.command.decode('utf-8', 'replace')) + self.close_reason = "Invalid command %s" % self.command.decode('utf-8', 'replace') self.set_state("close") return False if retval: @@ -417,8 +416,7 @@ def bm_command_object(self): BMProto.stopDownloadingObject(self.object.inventoryHash, True) else: try: - hex_hash = hexlify(self.object.inventoryHash).decode('ascii') - del missingObjects[hex_hash] + del missingObjects[bytes(self.object.inventoryHash)] except KeyError: pass @@ -446,16 +444,12 @@ def bm_command_addr(self): """Incoming addresses, process them""" # not using services for seenTime, stream, _, ip, port in self._decode_addr(): - if (stream not in state.streamsInWhichIAmParticipating): + if ( + stream not in state.streamsInWhichIAmParticipating + # FIXME: should check against complete list + or ip.decode('utf-8', 'replace').startswith('bootstrap') + ): continue - try: - if ( - # FIXME: should check against complete list - ip.decode('ascii', 'backslashreplace').startswith('bootstrap') - ): - continue - except UnicodeDecodeError: - pass decodedIP = protocol.checkIPAddress(ip) if ( decodedIP and time.time() - seenTime > 0 @@ -532,7 +526,7 @@ def bm_command_version(self): logger.debug( 'remote node incoming address: %s:%i', self.destination.host, self.peerNode.port) - logger.debug('user agent: %s', self.userAgent.decode('utf-8', 'backslashreplace')) + logger.debug('user agent: %s', self.userAgent.decode('utf-8', 'replace')) logger.debug('streams: [%s]', ','.join(map(str, self.streams))) if not self.peerValidityChecks(): # ABORT afterwards @@ -540,7 +534,7 @@ def bm_command_version(self): self.append_write_buf(protocol.CreatePacket(b'verack')) self.verackSent = True ua_valid = re.match( - r'^/[a-zA-Z]+:[0-9]+\.?[\w\s\(\)\./:;-]*/$', self.userAgent.decode('utf-8', 'backslashreplace')) + r'^/[a-zA-Z]+:[0-9]+\.?[\w\s\(\)\./:;-]*/$', self.userAgent.decode('utf-8', 'replace')) if not ua_valid: self.userAgent = b'/INVALID:0/' if not self.isOutbound: @@ -659,8 +653,7 @@ def stopDownloadingObject(hashId, forwardAnyway=False): except KeyError: pass try: - hex_hash = hexlify(hashId).decode('ascii') - del missingObjects[hex_hash] + del missingObjects[bytes(hashId)] except KeyError: pass diff --git a/src/network/dandelion.py b/src/network/dandelion.py index 7d3d881b8d..846b03e17d 100644 --- a/src/network/dandelion.py +++ b/src/network/dandelion.py @@ -6,7 +6,7 @@ from random import choice, expovariate, sample from threading import RLock from time import time -from binascii import hexlify, unhexlify +from binascii import hexlify import network.connectionpool as connectionpool import state @@ -53,8 +53,7 @@ def addHash(self, hashId, source=None, stream=1): if not state.dandelion_enabled: return with self.lock: - hex_hash = hexlify(hashId).decode('ascii') - self.hashMap[hex_hash] = Stem( + self.hashMap[bytes(hashId)] = Stem( self.getNodeStem(source), stream, self.poissonTimeout()) @@ -65,34 +64,31 @@ def setHashStream(self, hashId, stream=1): include streams, we only learn this after receiving the object) """ with self.lock: - hex_hash = hexlify(hashId).decode('ascii') - if hex_hash in self.hashMap: - self.hashMap[hex_hash] = Stem( - self.hashMap[hex_hash].child, + hashId_bytes = bytes(hashId) + if hashId_bytes in self.hashMap: + self.hashMap[hashId_bytes] = Stem( + self.hashMap[hashId_bytes].child, stream, self.poissonTimeout()) def removeHash(self, hashId, reason="no reason specified"): """Switch inventory vector from stem to fluff mode""" - hex_hash = hexlify(hashId).decode('ascii') if logger.isEnabledFor(logging.DEBUG): logger.debug( - '%s entering fluff mode due to %s.', hex_hash, reason) + '%s entering fluff mode due to %s.', hexlify(hashId).decode(), reason) with self.lock: try: - del self.hashMap[hex_hash] + del self.hashMap[bytes(hashId)] except KeyError: pass def hasHash(self, hashId): """Is inventory vector in stem mode?""" - hex_hash = hexlify(hashId).decode('ascii') - return hex_hash in self.hashMap + return bytes(hashId) in self.hashMap def objectChildStem(self, hashId): """Child (i.e. next) node for an inventory vector during stem mode""" - hex_hash = hexlify(hashId).decode('ascii') - return self.hashMap[hex_hash].child + return self.hashMap[bytes(hashId)].child def maybeAddStem(self, connection): """ @@ -112,7 +108,7 @@ def maybeAddStem(self, connection): }.items(): self.hashMap[k] = Stem( connection, v.stream, self.poissonTimeout()) - invQueue.put((v.stream, unhexlify(k), v.child)) + invQueue.put((v.stream, k, v.child)) def maybeRemoveStem(self, connection): """ @@ -173,7 +169,7 @@ def expire(self): with self.lock: deadline = time() toDelete = [ - [v.stream, unhexlify(k), v.child] for k, v in self.hashMap.items() + [v.stream, k, v.child] for k, v in self.hashMap.items() if v.timeout < deadline ] diff --git a/src/network/downloadthread.py b/src/network/downloadthread.py index 9900cc5a3b..4d2c5fedd6 100644 --- a/src/network/downloadthread.py +++ b/src/network/downloadthread.py @@ -9,7 +9,6 @@ import network.connectionpool as connectionpool from .objectracker import missingObjects from .threads import StoppableThread -from binascii import hexlify class DownloadThread(StoppableThread): @@ -68,8 +67,7 @@ def run(self): continue payload.extend(chunk) chunkCount += 1 - hex_chunk = hexlify(chunk).decode('ascii') - missingObjects[hex_chunk] = now + missingObjects[bytes(chunk)] = now if not chunkCount: continue payload[0:0] = addresses.encodeVarint(chunkCount) diff --git a/src/network/objectracker.py b/src/network/objectracker.py index dcea8d235b..63425def3f 100644 --- a/src/network/objectracker.py +++ b/src/network/objectracker.py @@ -3,7 +3,6 @@ """ import time from threading import RLock -from binascii import hexlify import state import network.connectionpool as connectionpool @@ -82,27 +81,28 @@ def clean(self): def hasObj(self, hashid): """Do we already have object?""" + hashid_bytes = bytes(hashid) if haveBloom: - return hashid in self.invBloom - return hashid in self.objectsNewToMe + return hashid_bytes in self.invBloom + return hashid_bytes in self.objectsNewToMe def handleReceivedInventory(self, hashId): """Handling received inventory""" - hex_hash = hexlify(hashId).decode('ascii') + hashId_bytes = bytes(hashId) if haveBloom: - self.invBloom.add(hex_hash) + self.invBloom.add(hashId_bytes) try: with self.objectsNewToThemLock: - del self.objectsNewToThem[hex_hash] + del self.objectsNewToThem[hashId_bytes] except KeyError: pass - if hex_hash not in missingObjects: - missingObjects[hex_hash] = time.time() + if hashId_bytes not in missingObjects: + missingObjects[hashId_bytes] = time.time() self.objectsNewToMe[hashId] = True def handleReceivedObject(self, streamNumber, hashid): """Handling received object""" - hex_hash = hexlify(hashid).decode('ascii') + hashid_bytes = bytes(hashid); for i in connectionpool.pool.connections(): if not i.fullyEstablished: continue @@ -113,7 +113,7 @@ def handleReceivedObject(self, streamNumber, hashid): not state.Dandelion.hasHash(hashid) or state.Dandelion.objectChildStem(hashid) == i): with i.objectsNewToThemLock: - i.objectsNewToThem[hex_hash] = time.time() + i.objectsNewToThem[hashid_bytes] = time.time() # update stream number, # which we didn't have when we just received the dinv # also resets expiration of the stem mode @@ -122,7 +122,7 @@ def handleReceivedObject(self, streamNumber, hashid): if i == self: try: with i.objectsNewToThemLock: - del i.objectsNewToThem[hex_hash] + del i.objectsNewToThem[hashid_bytes] except KeyError: pass self.objectsNewToMe.setLastObject() @@ -136,4 +136,4 @@ def hasAddr(self, addr): def addAddr(self, hashid): """WIP, should be moved to addrthread.py or removed""" if haveBloom: - self.addrBloom.add(hashid) + self.addrBloom.add(bytes(hashid)) diff --git a/src/protocol.py b/src/protocol.py index 93b4a35134..8ea2ff6755 100644 --- a/src/protocol.py +++ b/src/protocol.py @@ -487,8 +487,7 @@ def decryptAndCheckPubkeyPayload(data, address): encryptedData = data[readPosition:] # Let us try to decrypt the pubkey - hex_tag = 'tag-' + hexlify(tag).decode('ascii') - toAddress, cryptorObject = state.neededPubkeys[hex_tag] + toAddress, cryptorObject = state.neededPubkeys[bytes(tag)] if toAddress != address: logger.critical( 'decryptAndCheckPubkeyPayload failed due to toAddress' diff --git a/src/randomtrackingdict.py b/src/randomtrackingdict.py index 26a40e367a..1435180a77 100644 --- a/src/randomtrackingdict.py +++ b/src/randomtrackingdict.py @@ -39,12 +39,10 @@ def __len__(self): return self.len def __contains__(self, key): - hex_key = hexlify(key).decode('ascii') - return hex_key in self.dictionary + return bytes(key) in self.dictionary def __getitem__(self, key): - hex_key = hexlify(key).decode('ascii') - return self.dictionary[hex_key][1] + return self.dictionary[bytes(key)][1] def _swap(self, i1, i2): with self.lock: @@ -52,30 +50,28 @@ def _swap(self, i1, i2): key2 = self.indexDict[i2] self.indexDict[i1] = key2 self.indexDict[i2] = key1 - hex_key1 = hexlify(key1).decode('ascii') - hex_key2 = hexlify(key2).decode('ascii') - self.dictionary[hex_key1][0] = i2 - self.dictionary[hex_key2][0] = i1 + self.dictionary[bytes(key1)][0] = i2 + self.dictionary[bytes(key2)][0] = i1 # for quick reassignment return i2 def __setitem__(self, key, value): with self.lock: - hex_key = hexlify(key).decode('ascii') - if hex_key in self.dictionary: - self.dictionary[hex_key][1] = value + key_bytes = bytes(key) + if key_bytes in self.dictionary: + self.dictionary[key_bytes][1] = value else: self.indexDict.append(key) - self.dictionary[hex_key] = [self.len, value] + self.dictionary[key_bytes] = [self.len, value] self._swap(self.len, self.len - self.pendingLen) self.len += 1 def __delitem__(self, key): - hex_key = hexlify(key).decode('ascii') - if hex_key not in self.dictionary: + key_bytes = bytes(key) + if key_bytes not in self.dictionary: raise KeyError with self.lock: - index = self.dictionary[hex_key][0] + index = self.dictionary[key_bytes][0] # not pending if index < self.len - self.pendingLen: # left of pending part @@ -89,7 +85,7 @@ def __delitem__(self, key): # operation can improve 4x, but it's already very fast so we'll # ignore it for the time being del self.indexDict[-1] - del self.dictionary[hex_key] + del self.dictionary[key_bytes] self.len -= 1 def setMaxPending(self, maxPending): diff --git a/src/shared.py b/src/shared.py index 48ac7c91cf..a1541eacf9 100644 --- a/src/shared.py +++ b/src/shared.py @@ -114,13 +114,11 @@ def reloadMyAddressHashes(): if len(privEncryptionKey) == 64: myECCryptorObjects[hashobj] = \ highlevelcrypto.makeCryptor(privEncryptionKey) - hex_hash = hexlify(hashobj).decode('ascii') - myAddressesByHash[hex_hash] = addressInKeysFile + myAddressesByHash[bytes(hashobj)] = addressInKeysFile tag = highlevelcrypto.double_sha512( encodeVarint(addressVersionNumber) + encodeVarint(streamNumber) + hashobj)[32:] - hex_tag = hexlify(tag).decode('ascii') - myAddressesByTag[hex_tag] = addressInKeysFile + myAddressesByTag[bytes(tag)] = addressInKeysFile if not keyfileSecure: fixSensitiveFilePermissions(os.path.join( @@ -151,8 +149,7 @@ def reloadBroadcastSendersForWhichImWatching(): encodeVarint(addressVersionNumber) + encodeVarint(streamNumber) + hashobj ).digest()[:32] - hex_hash = hexlify(hashobj).decode('ascii') - MyECSubscriptionCryptorObjects[hex_hash] = \ + MyECSubscriptionCryptorObjects[bytes(hashobj)] = \ highlevelcrypto.makeCryptor(hexlify(privEncryptionKey)) else: doubleHashOfAddressData = highlevelcrypto.double_sha512( @@ -161,8 +158,7 @@ def reloadBroadcastSendersForWhichImWatching(): ) tag = doubleHashOfAddressData[32:] privEncryptionKey = doubleHashOfAddressData[:32] - hex_tag = hexlify(tag).decode('ascii') - MyECSubscriptionCryptorObjects[hex_tag] = \ + MyECSubscriptionCryptorObjects[bytes(tag)] = \ highlevelcrypto.makeCryptor(hexlify(privEncryptionKey)) diff --git a/src/storage/filesystem.py b/src/storage/filesystem.py index 531c80f5ab..e756a82016 100644 --- a/src/storage/filesystem.py +++ b/src/storage/filesystem.py @@ -70,7 +70,7 @@ def __setitem__(self, hashval, value): os.makedirs(os.path.join( self.baseDir, FilesystemInventory.objectDir, - hexlify(hashval).decode('ascii'))) + hexlify(hashval).decode())) except OSError: pass try: @@ -78,7 +78,7 @@ def __setitem__(self, hashval, value): os.path.join( self.baseDir, FilesystemInventory.objectDir, - hexlify(hashval).decode('ascii'), + hexlify(hashval).decode(), FilesystemInventory.metadataFilename, ), "w", @@ -87,12 +87,12 @@ def __setitem__(self, hashval, value): value.type, value.stream, value.expires, - hexlify(value.tag).decode('ascii'))) + hexlify(value.tag).decode())) with open( os.path.join( self.baseDir, FilesystemInventory.objectDir, - hexlify(hashval).decode('ascii'), + hexlify(hashval).decode(), FilesystemInventory.dataFilename, ), "wb", @@ -119,7 +119,7 @@ def delHashId(self, hashval): os.path.join( self.baseDir, FilesystemInventory.objectDir, - hexlify(hashval).decode('ascii'), + hexlify(hashval).decode(), FilesystemInventory.metadataFilename)) except IOError: pass @@ -128,7 +128,7 @@ def delHashId(self, hashval): os.path.join( self.baseDir, FilesystemInventory.objectDir, - hexlify(hashval).decode('ascii'), + hexlify(hashval).decode(), FilesystemInventory.dataFilename)) except IOError: pass @@ -136,7 +136,7 @@ def delHashId(self, hashval): os.rmdir(os.path.join( self.baseDir, FilesystemInventory.objectDir, - hexlify(hashval).decode('ascii'))) + hexlify(hashval).decode())) except IOError: pass @@ -186,7 +186,7 @@ def getData(self, hashId): os.path.join( self.baseDir, FilesystemInventory.objectDir, - hexlify(hashId).decode('ascii'), + hexlify(hashId).decode(), FilesystemInventory.dataFilename, ), "r", @@ -202,7 +202,7 @@ def getMetadata(self, hashId): os.path.join( self.baseDir, FilesystemInventory.objectDir, - hexlify(hashId).decode('ascii'), + hexlify(hashId).decode(), FilesystemInventory.metadataFilename, ), "r", diff --git a/src/storage/sqlite.py b/src/storage/sqlite.py index 1b07225792..6f810a1664 100644 --- a/src/storage/sqlite.py +++ b/src/storage/sqlite.py @@ -4,7 +4,6 @@ import sqlite3 import time from threading import RLock -from binascii import hexlify, unhexlify from helper_sql import SqlBulkExecute, sqlExecute, sqlQuery from .storage import InventoryItem, InventoryStorage @@ -30,21 +29,21 @@ def __init__(self): def __contains__(self, hash_): with self.lock: - hex_hash = hexlify(hash_).decode('ascii') - if hex_hash in self._objects: + hash_bytes = bytes(hash_) + if hash_bytes in self._objects: return True rows = sqlQuery( 'SELECT streamnumber FROM inventory WHERE hash=?', hash_) if not rows: return False - self._objects[hex_hash] = rows[0][0] + self._objects[hash_bytes] = rows[0][0] return True def __getitem__(self, hash_): with self.lock: - hex_hash = hexlify(hash_).decode('ascii') - if hex_hash in self._inventory: - return self._inventory[hex_hash] + hash_bytes = bytes(hash_) + if hash_bytes in self._inventory: + return self._inventory[hash_bytes] rows = sqlQuery( 'SELECT objecttype, streamnumber, payload, expirestime, tag' ' FROM inventory WHERE hash=?', hash_) @@ -55,16 +54,16 @@ def __getitem__(self, hash_): def __setitem__(self, hash_, value): with self.lock: value = InventoryItem(*value) - hex_hash = hexlify(hash_).decode('ascii') - self._inventory[hex_hash] = value - self._objects[hex_hash] = value.stream + hash_bytes = bytes(hash_) + self._inventory[hash_bytes] = value + self._objects[hash_bytes] = value.stream def __delitem__(self, hash_): raise NotImplementedError def __iter__(self): with self.lock: - hashes = map(unhexlify, self._inventory.keys()[:]) + hashes = [] + self._inventory.keys() hashes += (x for x, in sqlQuery('SELECT hash FROM inventory')) return hashes.__iter__() @@ -96,7 +95,7 @@ def unexpired_hashes_by_stream(self, stream): """Return unexpired inventory vectors filtered by stream""" with self.lock: t = int(time.time()) - hashes = [unhexlify(x) for x, value in self._inventory.items() + hashes = [x for x, value in self._inventory.items() if value.stream == stream and value.expires > t] hashes += (payload for payload, in sqlQuery( 'SELECT hash FROM inventory WHERE streamnumber=?' @@ -112,7 +111,7 @@ def flush(self): for objectHash, value in self._inventory.items(): sql.execute( 'INSERT INTO inventory VALUES (?, ?, ?, ?, ?, ?)', - unhexlify(objectHash), *value) + objectHash, *value) self._inventory.clear() def clean(self): diff --git a/src/tests/test_api_thread.py b/src/tests/test_api_thread.py index beb818766d..6e453b1923 100644 --- a/src/tests/test_api_thread.py +++ b/src/tests/test_api_thread.py @@ -82,12 +82,12 @@ def test_disseminate_preencrypted(self): proofofwork.init() self.assertEqual( unhexlify(self.api.disseminatePreparedObject( - hexlify(sample_object_data).decode('ascii'))), + hexlify(sample_object_data).decode())), calculateInventoryHash(sample_object_data)) update_object = b'\x00' * 8 + pack( '>Q', int(time.time() + 7200)) + sample_object_data[16:] invhash = unhexlify(self.api.disseminatePreEncryptedMsg( - hexlify(update_object).decode('ascii') + hexlify(update_object).decode() )) obj_type, obj_stream, obj_data = state.Inventory[invhash][:3] self.assertEqual(obj_type, 42) From 24b83aae2aed88ade5a95729ee786b7f3ef71b9a Mon Sep 17 00:00:00 2001 From: Kashiko Koibumi Date: Fri, 17 May 2024 01:53:27 +0900 Subject: [PATCH 14/32] run autopep8 on src --- run-autopep8.sh | 2 ++ src/api.py | 1 + src/backend/address_generator.py | 1 + src/bitmessagemain.py | 43 +++++++++++++++--------------- src/bmconfigparser.py | 2 +- src/class_objectProcessor.py | 1 + src/class_singleWorker.py | 8 +++--- src/class_smtpServer.py | 3 +++ src/depends.py | 2 +- src/helper_msgcoding.py | 3 +++ src/inventory.py | 1 + src/messagetypes/message.py | 1 + src/network/__init__.py | 2 +- src/network/asyncore_pollchoose.py | 6 ++--- src/network/dandelion.py | 1 + src/network/httpd.py | 1 + src/network/objectracker.py | 2 +- src/network/receivequeuethread.py | 1 + src/network/socks4a.py | 3 +++ src/network/socks5.py | 3 +++ src/network/tls.py | 2 ++ src/pyelliptic/cipher.py | 1 + src/pyelliptic/openssl.py | 1 + src/qidenticon.py | 1 + src/singleinstance.py | 1 + src/storage/sqlite.py | 1 + src/tr.py | 1 + 27 files changed, 63 insertions(+), 32 deletions(-) create mode 100755 run-autopep8.sh diff --git a/run-autopep8.sh b/run-autopep8.sh new file mode 100755 index 0000000000..e879318fc8 --- /dev/null +++ b/run-autopep8.sh @@ -0,0 +1,2 @@ +#!/bin/sh +autopep8 --in-place --recursive src diff --git a/src/api.py b/src/api.py index a444556951..be2a64dd80 100644 --- a/src/api.py +++ b/src/api.py @@ -328,6 +328,7 @@ def __call__(self, func): class command(object): # pylint: disable=too-few-public-methods """Decorator for API command method""" + def __init__(self, *aliases): self.aliases = aliases diff --git a/src/backend/address_generator.py b/src/backend/address_generator.py index 312c313bc2..f5455a428e 100644 --- a/src/backend/address_generator.py +++ b/src/backend/address_generator.py @@ -12,6 +12,7 @@ class AddressGenerator(object): """"Base class for address generation and validation""" + def __init__(self): pass diff --git a/src/bitmessagemain.py b/src/bitmessagemain.py index f51ee06315..4d8ea61d54 100755 --- a/src/bitmessagemain.py +++ b/src/bitmessagemain.py @@ -9,6 +9,27 @@ # Right now, PyBitmessage only support connecting to stream 1. It doesn't # yet contain logic to expand into further streams. +from threads import ( + set_thread_name, printLock, + addressGenerator, objectProcessor, singleCleaner, singleWorker, sqlThread) +from singleinstance import singleinstance +from inventory import Inventory +from helper_startup import ( + adjustHalfOpenConnectionsLimit, fixSocket, start_proxyconfig) +from debug import logger # this should go before any threads +from bmconfigparser import config +from testmode_init import populate_api_test_data +import state +import shutdown +import network +import defaults +import traceback +import time +import threading +import signal +import multiprocessing +import getopt +import depends import os import sys @@ -18,34 +39,13 @@ from pybitmessage import pathmagic app_dir = pathmagic.setup() -import depends depends.check_dependencies() -import getopt -import multiprocessing # Used to capture a Ctrl-C keypress so that Bitmessage can shutdown gracefully. -import signal -import threading -import time -import traceback -import defaults # Network subsystem -import network -import shutdown -import state -from testmode_init import populate_api_test_data -from bmconfigparser import config -from debug import logger # this should go before any threads -from helper_startup import ( - adjustHalfOpenConnectionsLimit, fixSocket, start_proxyconfig) -from inventory import Inventory -from singleinstance import singleinstance # Synchronous threads -from threads import ( - set_thread_name, printLock, - addressGenerator, objectProcessor, singleCleaner, singleWorker, sqlThread) def signal_handler(signum, frame): @@ -81,6 +81,7 @@ def signal_handler(signum, frame): class Main(object): """Main PyBitmessage class""" + def start(self): """Start main application""" # pylint: disable=too-many-statements,too-many-branches,too-many-locals diff --git a/src/bmconfigparser.py b/src/bmconfigparser.py index abf285ad07..1062e63048 100644 --- a/src/bmconfigparser.py +++ b/src/bmconfigparser.py @@ -128,7 +128,7 @@ def save(self): shutil.copyfile(fileName, fileNameBak) # The backup succeeded. fileNameExisted = True - except(IOError, Exception): + except (IOError, Exception): # The backup failed. This can happen if the file # didn't exist before. fileNameExisted = False diff --git a/src/class_objectProcessor.py b/src/class_objectProcessor.py index 1a71f929d6..394601bedc 100644 --- a/src/class_objectProcessor.py +++ b/src/class_objectProcessor.py @@ -43,6 +43,7 @@ class objectProcessor(threading.Thread): The objectProcessor thread, of which there is only one, receives network objects (msg, broadcast, pubkey, getpubkey) from the receiveDataThreads. """ + def __init__(self): threading.Thread.__init__(self, name="objectProcessor") random.seed() diff --git a/src/class_singleWorker.py b/src/class_singleWorker.py index 7a41f3c1b4..8392e8d11c 100644 --- a/src/class_singleWorker.py +++ b/src/class_singleWorker.py @@ -1080,10 +1080,10 @@ def sendMsg(self): " more difficult than you are" " willing to do. {2}" ).format(str(float(requiredAverageProofOfWorkNonceTrialsPerByte) - / defaults.networkDefaultProofOfWorkNonceTrialsPerByte), - str(float(requiredPayloadLengthExtraBytes) - / defaults.networkDefaultPayloadLengthExtraBytes), - l10n.formatTimestamp())))) + / defaults.networkDefaultProofOfWorkNonceTrialsPerByte), + str(float(requiredPayloadLengthExtraBytes) + / defaults.networkDefaultPayloadLengthExtraBytes), + l10n.formatTimestamp())))) continue else: # if we are sending a message to ourselves or a chan.. self.logger.info('Sending a message.') diff --git a/src/class_smtpServer.py b/src/class_smtpServer.py index 44ea7c9cc4..e925bf3fdb 100644 --- a/src/class_smtpServer.py +++ b/src/class_smtpServer.py @@ -35,6 +35,7 @@ class SmtpServerChannelException(Exception): class smtpServerChannel(smtpd.SMTPChannel): """Asyncore channel for SMTP protocol (server)""" + def smtp_EHLO(self, arg): """Process an EHLO""" if not arg: @@ -73,6 +74,7 @@ def smtp_DATA(self, arg): class smtpServerPyBitmessage(smtpd.SMTPServer): """Asyncore SMTP server class""" + def handle_accept(self): """Accept a connection""" pair = self.accept() @@ -180,6 +182,7 @@ def process_message(self, peer, mailfrom, rcpttos, data): class smtpServer(StoppableThread): """SMTP server thread""" + def __init__(self, _=None): super(smtpServer, self).__init__(name="smtpServerThread") self.server = smtpServerPyBitmessage(('127.0.0.1', LISTENPORT), None) diff --git a/src/depends.py b/src/depends.py index 3f08f4d39f..3933777648 100755 --- a/src/depends.py +++ b/src/depends.py @@ -436,7 +436,7 @@ def check_dependencies(verbose=False, optional=False): if sys.hexversion < 0x3000000: logger.error( 'PyBitmessage requires Python 3 or greater') - #has_all_dependencies = False + # has_all_dependencies = False sys.exit() # FIXME: This needs to be uncommented when more of the code is python3 compatible diff --git a/src/helper_msgcoding.py b/src/helper_msgcoding.py index 225f352c86..9c2652d6dc 100644 --- a/src/helper_msgcoding.py +++ b/src/helper_msgcoding.py @@ -37,12 +37,14 @@ class MsgDecodeException(Exception): class DecompressionSizeException(MsgDecodeException): # pylint: disable=super-init-not-called """Decompression resulted in too much data (attack protection)""" + def __init__(self, size): self.size = size class MsgEncode(object): """Message encoder class""" + def __init__(self, message, encoding=BITMESSAGE_ENCODING_SIMPLE): self.data = None self.encoding = encoding @@ -86,6 +88,7 @@ def encodeTrivial(self, message): class MsgDecode(object): """Message decoder class""" + def __init__(self, encoding, data): self.encoding = encoding if self.encoding == BITMESSAGE_ENCODING_EXTENDED: diff --git a/src/inventory.py b/src/inventory.py index 8356262cd6..ccdf245dfb 100644 --- a/src/inventory.py +++ b/src/inventory.py @@ -21,6 +21,7 @@ class Inventory: Inventory class which uses storage backends to manage the inventory. """ + def __init__(self): self._moduleName = config.safeGet("inventory", "storage") self._realInventory = create_inventory_instance(self._moduleName) diff --git a/src/messagetypes/message.py b/src/messagetypes/message.py index 245c753fde..5989d41c9b 100644 --- a/src/messagetypes/message.py +++ b/src/messagetypes/message.py @@ -5,6 +5,7 @@ class MsgBase(object): # pylint: disable=too-few-public-methods """Base class for message types""" + def __init__(self): self.data = {"": type(self).__name__.lower()} diff --git a/src/network/__init__.py b/src/network/__init__.py index 1851e072de..cc7bfb58b2 100644 --- a/src/network/__init__.py +++ b/src/network/__init__.py @@ -12,7 +12,7 @@ def start(config, state): """Start network threads""" import state from .announcethread import AnnounceThread - import network.connectionpool as connectionpool # pylint: disable=relative-import + import network.connectionpool as connectionpool # pylint: disable=relative-import from .addrthread import AddrThread from .dandelion import Dandelion from .downloadthread import DownloadThread diff --git a/src/network/asyncore_pollchoose.py b/src/network/asyncore_pollchoose.py index ccbe2aefad..c8b9e3647d 100644 --- a/src/network/asyncore_pollchoose.py +++ b/src/network/asyncore_pollchoose.py @@ -564,12 +564,12 @@ def del_channel(self, map=None): try: kqueue_poller.pollster.control([select.kevent( fd, select.KQ_FILTER_READ, select.KQ_EV_DELETE)], 0) - except(AttributeError, KeyError, TypeError, IOError, OSError): + except (AttributeError, KeyError, TypeError, IOError, OSError): pass try: kqueue_poller.pollster.control([select.kevent( fd, select.KQ_FILTER_WRITE, select.KQ_EV_DELETE)], 0) - except(AttributeError, KeyError, TypeError, IOError, OSError): + except (AttributeError, KeyError, TypeError, IOError, OSError): pass try: epoll_poller.pollster.unregister(fd) @@ -726,7 +726,7 @@ def close(self): # XXX unresolved # cheap inheritance, used to pass all other attribute # references to the underlying socket object. - #def __getattr__(self, attr): + # def __getattr__(self, attr): # try: # retattr = getattr(self.socket, attr) # except AttributeError: diff --git a/src/network/dandelion.py b/src/network/dandelion.py index 846b03e17d..43f36857d8 100644 --- a/src/network/dandelion.py +++ b/src/network/dandelion.py @@ -28,6 +28,7 @@ class Dandelion: # pylint: disable=old-style-class """Dandelion class for tracking stem/fluff stages.""" + def __init__(self): # currently assignable child stems self.stem = [] diff --git a/src/network/httpd.py b/src/network/httpd.py index 654566c28d..a53d740ce1 100644 --- a/src/network/httpd.py +++ b/src/network/httpd.py @@ -69,6 +69,7 @@ def handle_write(self): class HTTPSRequestHandler(HTTPRequestHandler, TLSHandshake): """Handling HTTPS request""" + def __init__(self, sock): if not hasattr(self, '_map'): asyncore.dispatcher.__init__(self, sock) # pylint: disable=non-parent-init-called diff --git a/src/network/objectracker.py b/src/network/objectracker.py index 63425def3f..0c3c752b0f 100644 --- a/src/network/objectracker.py +++ b/src/network/objectracker.py @@ -102,7 +102,7 @@ def handleReceivedInventory(self, hashId): def handleReceivedObject(self, streamNumber, hashid): """Handling received object""" - hashid_bytes = bytes(hashid); + hashid_bytes = bytes(hashid) for i in connectionpool.pool.connections(): if not i.fullyEstablished: continue diff --git a/src/network/receivequeuethread.py b/src/network/receivequeuethread.py index 68ad612405..3dafc15c36 100644 --- a/src/network/receivequeuethread.py +++ b/src/network/receivequeuethread.py @@ -15,6 +15,7 @@ class ReceiveQueueThread(StoppableThread): """This thread processes data received from the network (which is done by the asyncore thread)""" + def __init__(self, num=0): super(ReceiveQueueThread, self).__init__(name="ReceiveQueue_%i" % num) diff --git a/src/network/socks4a.py b/src/network/socks4a.py index 2758838a27..0b16ded223 100644 --- a/src/network/socks4a.py +++ b/src/network/socks4a.py @@ -26,6 +26,7 @@ class Socks4aError(ProxyError): class Socks4a(Proxy): """SOCKS4a proxy class""" + def __init__(self, address=None): Proxy.__init__(self, address) self.ipaddr = None @@ -73,6 +74,7 @@ def proxy_sock_name(self): class Socks4aConnection(Socks4a): """Child SOCKS4a class used for making outbound connections.""" + def __init__(self, address): Socks4a.__init__(self, address=address) @@ -119,6 +121,7 @@ def state_pre_connect(self): class Socks4aResolver(Socks4a): """DNS resolver class using SOCKS4a""" + def __init__(self, host): self.host = host self.port = 8444 diff --git a/src/network/socks5.py b/src/network/socks5.py index 1838a737fa..3542efc40d 100644 --- a/src/network/socks5.py +++ b/src/network/socks5.py @@ -42,6 +42,7 @@ class Socks5Error(ProxyError): class Socks5(Proxy): """A socks5 proxy base class""" + def __init__(self, address=None): Proxy.__init__(self, address) self.ipaddr = None @@ -163,6 +164,7 @@ def proxy_sock_name(self): class Socks5Connection(Socks5): """Child socks5 class used for making outbound connections.""" + def state_auth_done(self): """Request connection to be made""" # Now we can request the actual connection @@ -199,6 +201,7 @@ def state_pre_connect(self): class Socks5Resolver(Socks5): """DNS resolver class using socks5""" + def __init__(self, host): self.host = host self.port = 8444 diff --git a/src/network/tls.py b/src/network/tls.py index 2f30fcc025..0984108235 100644 --- a/src/network/tls.py +++ b/src/network/tls.py @@ -40,10 +40,12 @@ else: sslProtocolCiphers = "AECDH-AES256-SHA" + class TLSDispatcher(AdvancedDispatcher): """TLS functionality for classes derived from AdvancedDispatcher""" # pylint: disable=too-many-instance-attributes, too-many-arguments # pylint: disable=super-init-not-called + def __init__(self, _=None, sock=None, certfile=None, keyfile=None, server_side=False, ciphers=sslProtocolCiphers): self.want_read = self.want_write = True diff --git a/src/pyelliptic/cipher.py b/src/pyelliptic/cipher.py index 2c2c54dac6..dedba3a952 100644 --- a/src/pyelliptic/cipher.py +++ b/src/pyelliptic/cipher.py @@ -22,6 +22,7 @@ class Cipher(object): ctx2 = pyelliptic.Cipher("secretkey", iv, 0, ciphername='aes-256-cfb') print ctx2.ciphering(ciphertext) """ + def __init__(self, key, iv, do, ciphername='aes-256-cbc'): """ do == 1 => Encrypt; do == 0 => Decrypt diff --git a/src/pyelliptic/openssl.py b/src/pyelliptic/openssl.py index deb81644d8..aadb3e7ef5 100644 --- a/src/pyelliptic/openssl.py +++ b/src/pyelliptic/openssl.py @@ -100,6 +100,7 @@ class _OpenSSL(object): Wrapper for OpenSSL using ctypes """ # pylint: disable=too-many-statements, too-many-instance-attributes + def __init__(self, library): """ Build the wrapper diff --git a/src/qidenticon.py b/src/qidenticon.py index 158a2232d9..92d0b64d81 100644 --- a/src/qidenticon.py +++ b/src/qidenticon.py @@ -43,6 +43,7 @@ from six.moves import range from PyQt6 import QtCore, QtGui + class IdenticonRendererBase(object): """Encapsulate methods around rendering identicons""" diff --git a/src/singleinstance.py b/src/singleinstance.py index cff9d7946c..80eb411b0c 100644 --- a/src/singleinstance.py +++ b/src/singleinstance.py @@ -21,6 +21,7 @@ class singleinstance(object): Implements a single instance application by creating a lock file at appdata. """ + def __init__(self, flavor_id="", daemon=False): self.initialized = False self.counter = 0 diff --git a/src/storage/sqlite.py b/src/storage/sqlite.py index 6f810a1664..38d9fd95fe 100644 --- a/src/storage/sqlite.py +++ b/src/storage/sqlite.py @@ -11,6 +11,7 @@ class SqliteInventory(InventoryStorage): """Inventory using SQLite""" + def __init__(self): super(SqliteInventory, self).__init__() # of objects (like msg payloads and pubkey payloads) diff --git a/src/tr.py b/src/tr.py index 06e2e5d823..f26dcdffc7 100644 --- a/src/tr.py +++ b/src/tr.py @@ -15,6 +15,7 @@ class translateClass: when we are in daemon mode and not using any QT functions. """ # pylint: disable=old-style-class,too-few-public-methods + def __init__(self, context, text): self.context = context self.text = text From 60af4109abe76f0900202f634622a942abb38bb0 Mon Sep 17 00:00:00 2001 From: Kashiko Koibumi Date: Fri, 17 May 2024 02:14:59 +0900 Subject: [PATCH 15/32] fix complains from flake8 --- src/helper_msgcoding.py | 1 - src/network/asyncore_pollchoose.py | 1 - src/randomtrackingdict.py | 1 - src/storage/sqlite.py | 1 - src/tr.py | 2 +- 5 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/helper_msgcoding.py b/src/helper_msgcoding.py index 9c2652d6dc..401b0e2030 100644 --- a/src/helper_msgcoding.py +++ b/src/helper_msgcoding.py @@ -2,7 +2,6 @@ Message encoding end decoding functions """ -import string import zlib import messagetypes diff --git a/src/network/asyncore_pollchoose.py b/src/network/asyncore_pollchoose.py index c8b9e3647d..081efcf26d 100644 --- a/src/network/asyncore_pollchoose.py +++ b/src/network/asyncore_pollchoose.py @@ -11,7 +11,6 @@ import socket import sys import time -import warnings from errno import ( EADDRINUSE, EAGAIN, EALREADY, EBADF, ECONNABORTED, ECONNREFUSED, ECONNRESET, EHOSTUNREACH, EINPROGRESS, EINTR, EINVAL, EISCONN, ENETUNREACH, diff --git a/src/randomtrackingdict.py b/src/randomtrackingdict.py index 1435180a77..0944da2a8a 100644 --- a/src/randomtrackingdict.py +++ b/src/randomtrackingdict.py @@ -3,7 +3,6 @@ """ from threading import RLock from time import time -from binascii import hexlify try: import helper_random diff --git a/src/storage/sqlite.py b/src/storage/sqlite.py index 38d9fd95fe..4dae1ac3ac 100644 --- a/src/storage/sqlite.py +++ b/src/storage/sqlite.py @@ -1,7 +1,6 @@ """ Sqlite Inventory """ -import sqlite3 import time from threading import RLock diff --git a/src/tr.py b/src/tr.py index f26dcdffc7..a0cbf1a082 100644 --- a/src/tr.py +++ b/src/tr.py @@ -42,7 +42,7 @@ def translateText(context, text, n=None): enableGUI = True if enableGUI: try: - from PyQt6 import QtCore, QtGui, QtWidgets + from PyQt6 import QtWidgets except Exception as err: print('PyBitmessage requires PyQt unless you want to run it as a daemon' ' and interact with it using the API.' From ab9fc0b390fbd67540df5c58f1b40ac80095ca37 Mon Sep 17 00:00:00 2001 From: Kashiko Koibumi Date: Fri, 17 May 2024 03:18:24 +0900 Subject: [PATCH 16/32] run autopep8 on src/bitmessageqt --- run-autopep8.sh | 2 +- src/bitmessageqt/__init__.py | 99 +++++++++++++------------ src/bitmessageqt/address_dialogs.py | 2 + src/bitmessageqt/addressvalidator.py | 3 + src/bitmessageqt/bitmessage_icons_rc.py | 3 + src/bitmessageqt/bitmessageui.py | 62 ++++++++++------ src/bitmessageqt/blacklist.py | 8 +- src/bitmessageqt/dialogs.py | 4 + src/bitmessageqt/foldertree.py | 7 ++ src/bitmessageqt/messagecompose.py | 1 + src/bitmessageqt/messageview.py | 5 +- src/bitmessageqt/migrationwizard.py | 17 +++-- src/bitmessageqt/networkstatus.py | 1 + src/bitmessageqt/newchandialog.py | 5 +- src/bitmessageqt/retranslateui.py | 5 +- src/bitmessageqt/settings.py | 1 + src/bitmessageqt/settingsmixin.py | 5 ++ src/bitmessageqt/utils.py | 2 +- src/bitmessageqt/widgets.py | 2 + 19 files changed, 142 insertions(+), 92 deletions(-) diff --git a/run-autopep8.sh b/run-autopep8.sh index e879318fc8..701a6c0d70 100755 --- a/run-autopep8.sh +++ b/run-autopep8.sh @@ -1,2 +1,2 @@ #!/bin/sh -autopep8 --in-place --recursive src +autopep8 --in-place --recursive src src/bitmessageqt diff --git a/src/bitmessageqt/__init__.py b/src/bitmessageqt/__init__.py index aaf2f24319..dd922a25dc 100644 --- a/src/bitmessageqt/__init__.py +++ b/src/bitmessageqt/__init__.py @@ -53,7 +53,7 @@ from .statusbar import BMStatusBar import bitmessageqt.sound as sound # This is needed for tray icon -import bitmessageqt.bitmessage_icons_rc as bitmessage_icons_rc # noqa:F401 pylint: disable=unused-import +import bitmessageqt.bitmessage_icons_rc as bitmessage_icons_rc # noqa:F401 pylint: disable=unused-import import helper_sent try: @@ -152,8 +152,9 @@ def init_file_menu(self): self.ui.actionNetworkSwitch.triggered.connect(self.network_switch) self.ui.actionManageKeys.triggered.connect(self.click_actionManageKeys) self.ui.actionDeleteAllTrashedMessages.triggered.connect(self.click_actionDeleteAllTrashedMessages) - self.ui.actionRegenerateDeterministicAddresses.triggered.connect(self.click_actionRegenerateDeterministicAddresses) - self.ui.pushButtonAddChan.clicked.connect(self.click_actionJoinChan) # also used for creating chans. + self.ui.actionRegenerateDeterministicAddresses.triggered.connect( + self.click_actionRegenerateDeterministicAddresses) + self.ui.pushButtonAddChan.clicked.connect(self.click_actionJoinChan) # also used for creating chans. self.ui.pushButtonNewAddress.clicked.connect(self.click_NewAddressDialog) self.ui.pushButtonAddAddressBook.clicked.connect(self.click_pushButtonAddAddressBook) self.ui.pushButtonAddSubscription.clicked.connect(self.click_pushButtonAddSubscription) @@ -752,11 +753,11 @@ def __init__(self, parent=None): # Put the TTL slider in the correct spot TTL = config.getint('bitmessagesettings', 'ttl') - if TTL < 3600: # an hour + if TTL < 3600: # an hour TTL = 3600 - elif TTL > 28*24*60*60: # 28 days - TTL = 28*24*60*60 - self.ui.horizontalSliderTTL.setSliderPosition(int((TTL - 3600) ** (1/3.199))) + elif TTL > 28 * 24 * 60 * 60: # 28 days + TTL = 28 * 24 * 60 * 60 + self.ui.horizontalSliderTTL.setSliderPosition(int((TTL - 3600) ** (1 / 3.199))) self.updateHumanFriendlyTTLDescription(TTL) self.ui.horizontalSliderTTL.valueChanged.connect(self.updateTTL) @@ -815,20 +816,20 @@ def updateTTL(self, sliderPosition): config.save() def updateHumanFriendlyTTLDescription(self, TTL): - numberOfHours = int(round(TTL / (60*60))) + numberOfHours = int(round(TTL / (60 * 60))) font = QtGui.QFont() stylesheet = "" if numberOfHours < 48: self.ui.labelHumanFriendlyTTLDescription.setText( - _translate("MainWindow", "%n hour(s)", None, numberOfHours) + - ", " + - _translate("MainWindow", "not recommended for chans", None) - ) + _translate("MainWindow", "%n hour(s)", None, numberOfHours) + + ", " + + _translate("MainWindow", "not recommended for chans", None) + ) stylesheet = "QLabel { color : red; }" font.setBold(True) else: - numberOfDays = int(round(TTL / (24*60*60))) + numberOfDays = int(round(TTL / (24 * 60 * 60))) self.ui.labelHumanFriendlyTTLDescription.setText( _translate( "MainWindow", @@ -1104,7 +1105,7 @@ def addMessageListItemSent( else: statusText = _translate( "MainWindow", "Unknown status: {0} {1}").format(status, - l10n.formatTimestamp(lastactiontime)) + l10n.formatTimestamp(lastactiontime)) items = [ MessageList_AddressWidget( @@ -1221,7 +1222,7 @@ def loadMessagelist( # create application indicator def appIndicatorInit(self, app): self.initTrayIcon("can-icon-24px-red.png", app) - self.tray.activated.connect(self.__icon_activated); + self.tray.activated.connect(self.__icon_activated) m = QtWidgets.QMenu() @@ -1392,7 +1393,7 @@ def _simple_notify( self._notifier = _simple_notify # does nothing if isAvailable returns false # XXX unresolved - #self._player = QtGui.QSound.play + # self._player = QtGui.QSound.play if not get_plugins: return @@ -1406,7 +1407,7 @@ def _simple_notify( self._theme_player = get_plugin('notification.sound', 'theme') # XXX unresolved - #if not QtGui.QSound.isAvailable(): + # if not QtGui.QSound.isAvailable(): if not False: _plugin = get_plugin( 'notification.sound', 'file', fallback='file.fallback') @@ -1779,7 +1780,7 @@ def calcTrayIcon(self, iconFileName, inboxUnreadCount): pen.setBrush(QtGui.QBrush(QtCore.Qt.BrushStyle.SolidPattern)) painter.setPen(pen) painter.setFont(font) - painter.drawText(24-rect.right()-marginX, -rect.top()+marginY, txt) + painter.drawText(24 - rect.right() - marginX, -rect.top() + marginY, txt) painter.end() return QtGui.QIcon(pixmap) @@ -1856,7 +1857,7 @@ def updateSentItemStatusByAckdata(self, ackdata, textToDisplay): try: newlinePosition = textToDisplay.indexOf('\n') except: - # If someone misses adding a "_translate" to a string before passing it to this function, + # If someone misses adding a "_translate" to a string before passing it to this function, # this function won't receive a qstring which will cause an exception. newlinePosition = 0 if newlinePosition > 1: @@ -1893,7 +1894,7 @@ def newVersionAvailable(self, version): "MainWindow", "New version of PyBitmessage is available: {0}. Download it" " from https://github.com/Bitmessage/PyBitmessage/releases/latest" - ).format(self.notifiedNewVersion) + ).format(self.notifiedNewVersion) ) def displayAlert(self, title, text, exitAfterUserClicksOk): @@ -1917,7 +1918,7 @@ def rerenderMessagelistToLabels(self): messagelist.item(i, 0).setLabel() def rerenderAddressBook(self): - def addRow (address, label, type): + def addRow(address, label, type): self.ui.tableWidgetAddressBook.insertRow(0) newItem = Ui_AddressBookWidgetItemLabel(address, label, type) self.ui.tableWidgetAddressBook.setItem(0, 0, newItem) @@ -2065,14 +2066,14 @@ def click_pushButtonSend(self): "MainWindow", "You are trying to send an email instead of a bitmessage. " "This requires registering with a gateway. Attempt to register?"), - QtWidgets.QMessageBox.StandardButton.Yes|QtWidgets.QMessageBox.StandardButton.No) != QtWidgets.QMessageBox.StandardButton.Yes: + QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No) != QtWidgets.QMessageBox.StandardButton.Yes: continue email = acct.getLabel() - if email[-14:] != "@mailchuck.com": # attempt register + if email[-14:] != "@mailchuck.com": # attempt register # 12 character random email address email = ''.join( random.SystemRandom().choice(string.ascii_lowercase) for _ in range(12) - ) + "@mailchuck.com" + ) + "@mailchuck.com" acct = MailchuckAccount(fromAddress) acct.register(email) config.set(fromAddress, 'label', email) @@ -2084,7 +2085,7 @@ def click_pushButtonSend(self): " an email gateway. Sending registration" " now as {0}, please wait for the registration" " to be processed before retrying sending." - ).format(email) + ).format(email) ) return status, addressVersionNumber, streamNumber = decodeAddress(toAddress)[:3] @@ -2100,19 +2101,19 @@ def click_pushButtonSend(self): "MainWindow", "Error: Bitmessage addresses start with" " BM- Please check the recipient address {0}" - ).format(toAddress)) + ).format(toAddress)) elif status == 'checksumfailed': self.updateStatusBar(_translate( "MainWindow", "Error: The recipient address {0} is not" " typed or copied correctly. Please check it." - ).format(toAddress)) + ).format(toAddress)) elif status == 'invalidcharacters': self.updateStatusBar(_translate( "MainWindow", "Error: The recipient address {0} contains" " invalid characters. Please check it." - ).format(toAddress)) + ).format(toAddress)) elif status == 'versiontoohigh': self.updateStatusBar(_translate( "MainWindow", @@ -2120,7 +2121,7 @@ def click_pushButtonSend(self): " {0} is too high. Either you need to upgrade" " your Bitmessage software or your" " acquaintance is being clever." - ).format(toAddress)) + ).format(toAddress)) elif status == 'ripetooshort': self.updateStatusBar(_translate( "MainWindow", @@ -2128,7 +2129,7 @@ def click_pushButtonSend(self): " address {0} is too short. There might be" " something wrong with the software of" " your acquaintance." - ).format(toAddress)) + ).format(toAddress)) elif status == 'ripetoolong': self.updateStatusBar(_translate( "MainWindow", @@ -2136,7 +2137,7 @@ def click_pushButtonSend(self): " address {0} is too long. There might be" " something wrong with the software of" " your acquaintance." - ).format(toAddress)) + ).format(toAddress)) elif status == 'varintmalformed': self.updateStatusBar(_translate( "MainWindow", @@ -2144,13 +2145,13 @@ def click_pushButtonSend(self): " address {0} is malformed. There might be" " something wrong with the software of" " your acquaintance." - ).format(toAddress)) + ).format(toAddress)) else: self.updateStatusBar(_translate( "MainWindow", "Error: Something is wrong with the" " recipient address {0}." - ).format(toAddress)) + ).format(toAddress)) elif fromAddress == '': self.updateStatusBar(_translate( "MainWindow", @@ -2306,7 +2307,7 @@ def rerenderComboBoxSendFrom(self): i, AccountColor(address).accountColor(), QtCore.Qt.ItemDataRole.ForegroundRole) self.ui.comboBoxSendFrom.insertItem(0, '', '') - if(self.ui.comboBoxSendFrom.count() == 2): + if (self.ui.comboBoxSendFrom.count() == 2): self.ui.comboBoxSendFrom.setCurrentIndex(1) else: self.ui.comboBoxSendFrom.setCurrentIndex(0) @@ -2329,7 +2330,7 @@ def rerenderComboBoxSendFromBroadcast(self): i, AccountColor(address).accountColor(), QtCore.Qt.ItemDataRole.ForegroundRole) self.ui.comboBoxSendFromBroadcast.insertItem(0, '', '') - if(self.ui.comboBoxSendFromBroadcast.count() == 2): + if (self.ui.comboBoxSendFromBroadcast.count() == 2): self.ui.comboBoxSendFromBroadcast.setCurrentIndex(1) else: self.ui.comboBoxSendFromBroadcast.setCurrentIndex(0) @@ -2659,13 +2660,13 @@ def quit(self): "MainWindow", "%n object(s) pending proof of work", None, powQueueSize() - ) + ", " + - _translate( + ) + ", " + + _translate( "MainWindow", "%n object(s) waiting to be distributed", None, pendingUpload() - ) + "\n\n" + - _translate( + ) + "\n\n" + + _translate( "MainWindow", "Wait until these tasks finish?"), QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No | QtWidgets.QMessageBox.StandardButton.Cancel, QtWidgets.QMessageBox.StandardButton.Cancel) @@ -2748,8 +2749,8 @@ def quit(self): if curWorkerQueue > 0: self.updateStatusBar(_translate( "MainWindow", "Waiting for PoW to finish... {0}%" - ).format(50 * (maxWorkerQueue - curWorkerQueue) / - maxWorkerQueue)) + ).format(50 * (maxWorkerQueue - curWorkerQueue) + / maxWorkerQueue)) time.sleep(0.5) QtCore.QCoreApplication.processEvents( QtCore.QEventLoop.ProcessEventsFlag.AllEvents, 1000 @@ -2855,10 +2856,10 @@ def on_action_InboxMessageForceHtml(self): lines[i]) elif lines[i] == '------------------------------------------------------': lines[i] = '
' - elif lines[i] == '' and (i+1) < totalLines and \ - lines[i+1] != '------------------------------------------------------': + elif lines[i] == '' and (i + 1) < totalLines and \ + lines[i + 1] != '------------------------------------------------------': lines[i] = '

' - content = ' '.join(lines) # To keep the whitespace between lines + content = ' '.join(lines) # To keep the whitespace between lines content = shared.fixPotentiallyInvalidUTF8Data(content) content = content textEdit.setHtml(content) @@ -3017,8 +3018,8 @@ def on_action_InboxReply(self, reply_type=None): toAddressAtCurrentInboxRow = fromAddressAtCurrentInboxRow if fromAddressAtCurrentInboxRow == \ tableWidget.item(currentInboxRow, column_from).label or ( - isinstance(acct, GatewayAccount) and - fromAddressAtCurrentInboxRow == acct.relayAddress): + isinstance(acct, GatewayAccount) + and fromAddressAtCurrentInboxRow == acct.relayAddress): self.ui.lineEditTo.setText(str(acct.fromAddress)) else: self.ui.lineEditTo.setText( @@ -3204,7 +3205,7 @@ def on_action_InboxSaveMessageAs(self): defaultFilename = "".join(x for x in subjectAtCurrentInboxRow if x.isalnum()) + '.txt' filename = QtWidgets.QFileDialog.getSaveFileName( self, - _translate("MainWindow","Save As..."), + _translate("MainWindow", "Save As..."), defaultFilename, "Text files (*.txt);;All files (*.*)") if filename == '': @@ -3662,8 +3663,8 @@ def on_action_ClipboardMessagelist(self): otherAddress = tableWidget.item(currentRow, 1).data(QtCore.Qt.ItemDataRole.UserRole) account = accountClass(myAddress) if isinstance(account, GatewayAccount) and otherAddress == account.relayAddress and ( - (currentColumn in [0, 2] and self.getCurrentFolder() == "sent") or - (currentColumn in [1, 2] and self.getCurrentFolder() != "sent")): + (currentColumn in [0, 2] and self.getCurrentFolder() == "sent") + or (currentColumn in [1, 2] and self.getCurrentFolder() != "sent")): text = str(tableWidget.item(currentRow, currentColumn).label) else: text = tableWidget.item(currentRow, currentColumn).data(QtCore.Qt.ItemDataRole.UserRole) diff --git a/src/bitmessageqt/address_dialogs.py b/src/bitmessageqt/address_dialogs.py index 29bfc50a54..30af4d9e14 100644 --- a/src/bitmessageqt/address_dialogs.py +++ b/src/bitmessageqt/address_dialogs.py @@ -216,6 +216,7 @@ def _onSuccess(self, addressVersion, streamNumber, ripe): class RegenerateAddressesDialog(QtWidgets.QDialog): """QDialog for regenerating deterministic addresses""" + def __init__(self, parent=None): super(RegenerateAddressesDialog, self).__init__(parent) widgets.load('regenerateaddresses.ui', self) @@ -288,6 +289,7 @@ def accept(self): class EmailGatewayDialog(QtWidgets.QDialog): """QDialog for email gateway control""" + def __init__(self, parent, config=global_config, account=None): super(EmailGatewayDialog, self).__init__(parent) widgets.load('emailgateway.ui', self) diff --git a/src/bitmessageqt/addressvalidator.py b/src/bitmessageqt/addressvalidator.py index 9785c3a2f8..f02faf0451 100644 --- a/src/bitmessageqt/addressvalidator.py +++ b/src/bitmessageqt/addressvalidator.py @@ -16,6 +16,7 @@ class AddressPassPhraseValidatorMixin(object): """Bitmessage address or passphrase validator class for Qt UI""" + def setParams( self, passPhraseObject=None, @@ -169,6 +170,7 @@ def checkData(self): class AddressValidator(QtGui.QValidator, AddressPassPhraseValidatorMixin): """AddressValidator class for Qt UI""" + def __init__(self, parent=None, passPhraseObject=None, feedBackObject=None, buttonBox=None, addressMandatory=True): super(AddressValidator, self).__init__(parent) self.setParams(passPhraseObject, parent, feedBackObject, buttonBox, addressMandatory) @@ -176,6 +178,7 @@ def __init__(self, parent=None, passPhraseObject=None, feedBackObject=None, butt class PassPhraseValidator(QtGui.QValidator, AddressPassPhraseValidatorMixin): """PassPhraseValidator class for Qt UI""" + def __init__(self, parent=None, addressObject=None, feedBackObject=None, buttonBox=None, addressMandatory=False): super(PassPhraseValidator, self).__init__(parent) self.setParams(parent, addressObject, feedBackObject, buttonBox, addressMandatory) diff --git a/src/bitmessageqt/bitmessage_icons_rc.py b/src/bitmessageqt/bitmessage_icons_rc.py index a06fd964f3..549b3e611b 100644 --- a/src/bitmessageqt/bitmessage_icons_rc.py +++ b/src/bitmessageqt/bitmessage_icons_rc.py @@ -1666,10 +1666,13 @@ \x00\x00\x01\xe6\x00\x00\x00\x00\x00\x01\x00\x00\x34\xdf\ " + def qInitResources(): QtCore.qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data) + def qCleanupResources(): QtCore.qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data) + qInitResources() diff --git a/src/bitmessageqt/bitmessageui.py b/src/bitmessageqt/bitmessageui.py index 2d4ce3eea3..268b4ae1b6 100644 --- a/src/bitmessageqt/bitmessageui.py +++ b/src/bitmessageqt/bitmessageui.py @@ -15,6 +15,7 @@ from .networkstatus import NetworkStatus from .blacklist import Blacklist + class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") @@ -22,7 +23,8 @@ def setupUi(self, MainWindow): self.MainDock = QtWidgets.QDockWidget(parent=MainWindow) self.MainDock.setGeometry(QtCore.QRect(0, 0, 885, 580)) icon = QtGui.QIcon() - icon.addPixmap(QtGui.QPixmap(":/newPrefix/images/can-icon-24px.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + icon.addPixmap(QtGui.QPixmap(":/newPrefix/images/can-icon-24px.png"), + QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) self.MainDock.setWindowIcon(icon) self.MainDock.setObjectName("MainDock") self.centralwidget = QtWidgets.QWidget() @@ -31,7 +33,8 @@ def setupUi(self, MainWindow): self.gridLayout_10.setObjectName("gridLayout_10") self.tabWidget = QtWidgets.QTabWidget(parent=self.centralwidget) self.tabWidget.setTabShape(QtWidgets.QTabWidget.TabShape.Rounded) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, + QtWidgets.QSizePolicy.Policy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.tabWidget.sizePolicy().hasHeightForWidth()) @@ -56,7 +59,8 @@ def setupUi(self, MainWindow): self.treeWidgetYourIdentities.setMaximumSize(QtCore.QSize(200, 16777215)) self.treeWidgetYourIdentities.setObjectName("treeWidgetYourIdentities") icon1 = QtGui.QIcon() - icon1.addPixmap(QtGui.QPixmap(":/newPrefix/images/identities.png"), QtGui.QIcon.Mode.Selected, QtGui.QIcon.State.Off) + icon1.addPixmap(QtGui.QPixmap(":/newPrefix/images/identities.png"), + QtGui.QIcon.Mode.Selected, QtGui.QIcon.State.Off) self.treeWidgetYourIdentities.headerItem().setIcon(0, icon1) self.verticalLayout_12.addWidget(self.treeWidgetYourIdentities) self.pushButtonNewAddress = QtWidgets.QPushButton(parent=self.inbox) @@ -135,7 +139,8 @@ def setupUi(self, MainWindow): self.tableWidgetAddressBook.setRowCount(0) item = QtWidgets.QTableWidgetItem() icon3 = QtGui.QIcon() - icon3.addPixmap(QtGui.QPixmap(":/newPrefix/images/addressbook.png"), QtGui.QIcon.Mode.Selected, QtGui.QIcon.State.Off) + icon3.addPixmap(QtGui.QPixmap(":/newPrefix/images/addressbook.png"), + QtGui.QIcon.Mode.Selected, QtGui.QIcon.State.Off) item.setIcon(icon3) self.tableWidgetAddressBook.setHorizontalHeaderItem(0, item) item = QtWidgets.QTableWidgetItem() @@ -311,7 +316,8 @@ def setupUi(self, MainWindow): self.treeWidgetSubscriptions.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows) self.treeWidgetSubscriptions.setObjectName("treeWidgetSubscriptions") icon5 = QtGui.QIcon() - icon5.addPixmap(QtGui.QPixmap(":/newPrefix/images/subscriptions.png"), QtGui.QIcon.Mode.Selected, QtGui.QIcon.State.Off) + icon5.addPixmap(QtGui.QPixmap(":/newPrefix/images/subscriptions.png"), + QtGui.QIcon.Mode.Selected, QtGui.QIcon.State.Off) self.treeWidgetSubscriptions.headerItem().setIcon(0, icon5) self.verticalLayout_3.addWidget(self.treeWidgetSubscriptions) self.pushButtonAddSubscription = QtWidgets.QPushButton(parent=self.subscriptions) @@ -338,8 +344,10 @@ def setupUi(self, MainWindow): self.tableWidgetInboxSubscriptions = QtWidgets.QTableWidget(parent=self.subscriptions) self.tableWidgetInboxSubscriptions.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers) self.tableWidgetInboxSubscriptions.setAlternatingRowColors(True) - self.tableWidgetInboxSubscriptions.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.ExtendedSelection) - self.tableWidgetInboxSubscriptions.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows) + self.tableWidgetInboxSubscriptions.setSelectionMode( + QtWidgets.QAbstractItemView.SelectionMode.ExtendedSelection) + self.tableWidgetInboxSubscriptions.setSelectionBehavior( + QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows) self.tableWidgetInboxSubscriptions.setWordWrap(False) self.tableWidgetInboxSubscriptions.setObjectName("tableWidgetInboxSubscriptions") self.tableWidgetInboxSubscriptions.setColumnCount(4) @@ -369,7 +377,8 @@ def setupUi(self, MainWindow): self.horizontalLayout_4.addLayout(self.verticalLayout_4) self.gridLayout_3.addLayout(self.horizontalLayout_4, 0, 0, 1, 1) icon6 = QtGui.QIcon() - icon6.addPixmap(QtGui.QPixmap(":/newPrefix/images/subscriptions.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + icon6.addPixmap(QtGui.QPixmap(":/newPrefix/images/subscriptions.png"), + QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) self.tabWidget.addTab(self.subscriptions, icon6, "") self.chans = QtWidgets.QWidget() self.chans.setObjectName("chans") @@ -388,7 +397,8 @@ def setupUi(self, MainWindow): self.treeWidgetChans.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows) self.treeWidgetChans.setObjectName("treeWidgetChans") icon7 = QtGui.QIcon() - icon7.addPixmap(QtGui.QPixmap(":/newPrefix/images/can-icon-16px.png"), QtGui.QIcon.Mode.Selected, QtGui.QIcon.State.Off) + icon7.addPixmap(QtGui.QPixmap(":/newPrefix/images/can-icon-16px.png"), + QtGui.QIcon.Mode.Selected, QtGui.QIcon.State.Off) self.treeWidgetChans.headerItem().setIcon(0, icon7) self.verticalLayout_17.addWidget(self.treeWidgetChans) self.pushButtonAddChan = QtWidgets.QPushButton(parent=self.chans) @@ -446,7 +456,8 @@ def setupUi(self, MainWindow): self.horizontalLayout_7.addLayout(self.verticalLayout_8) self.gridLayout_4.addLayout(self.horizontalLayout_7, 0, 0, 1, 1) icon8 = QtGui.QIcon() - icon8.addPixmap(QtGui.QPixmap(":/newPrefix/images/can-icon-16px.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + icon8.addPixmap(QtGui.QPixmap(":/newPrefix/images/can-icon-16px.png"), + QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) self.tabWidget.addTab(self.chans, icon8, "") self.blackwhitelist = Blacklist() self.blackwhitelist.setObjectName("blackwhitelist") @@ -598,19 +609,21 @@ def retranslateUi(self, MainWindow): self.label_2.setText(_translate("MainWindow", "From:")) self.label.setText(_translate("MainWindow", "To:")) self.textEditMessage.setHtml(_translate("MainWindow", "\n" -"\n" -"


")) - self.tabWidgetSend.setTabText(self.tabWidgetSend.indexOf(self.sendDirect), _translate("MainWindow", "Send ordinary Message")) + "\n" + "


")) + self.tabWidgetSend.setTabText(self.tabWidgetSend.indexOf(self.sendDirect), + _translate("MainWindow", "Send ordinary Message")) self.label_8.setText(_translate("MainWindow", "From:")) self.label_7.setText(_translate("MainWindow", "Subject:")) self.textEditMessageBroadcast.setHtml(_translate("MainWindow", "\n" -"\n" -"


")) - self.tabWidgetSend.setTabText(self.tabWidgetSend.indexOf(self.sendBroadcast), _translate("MainWindow", "Send Message to your Subscribers")) + "\n" + "


")) + self.tabWidgetSend.setTabText(self.tabWidgetSend.indexOf(self.sendBroadcast), + _translate("MainWindow", "Send Message to your Subscribers")) self.pushButtonTTL.setText(_translate("MainWindow", "TTL:")) self.pushButtonClear.setText(_translate("MainWindow", "Clear")) self.pushButtonSend.setText(_translate("MainWindow", "Send")) @@ -632,7 +645,8 @@ def retranslateUi(self, MainWindow): item.setText(_translate("MainWindow", "Subject")) item = self.tableWidgetInboxSubscriptions.horizontalHeaderItem(3) item.setText(_translate("MainWindow", "Received")) - self.tabWidget.setTabText(self.tabWidget.indexOf(self.subscriptions), _translate("MainWindow", "Subscriptions")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.subscriptions), + _translate("MainWindow", "Subscriptions")) self.treeWidgetChans.headerItem().setText(0, _translate("MainWindow", "Chans")) self.pushButtonAddChan.setText(_translate("MainWindow", "Add Chan")) self.inboxSearchLineEditChans.setPlaceholderText(_translate("MainWindow", "Search")) @@ -652,7 +666,8 @@ def retranslateUi(self, MainWindow): item.setText(_translate("MainWindow", "Received")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.chans), _translate("MainWindow", "Chans")) self.networkstatus.retranslateUi() - self.tabWidget.setTabText(self.tabWidget.indexOf(self.networkstatus), _translate("MainWindow", "Network Status")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.networkstatus), + _translate("MainWindow", "Network Status")) self.menuFile.setTitle(_translate("MainWindow", "File")) self.menuSettings.setTitle(_translate("MainWindow", "Settings")) self.menuHelp.setTitle(_translate("MainWindow", "Help")) @@ -665,7 +680,8 @@ def retranslateUi(self, MainWindow): self.actionSupport.setText(_translate("MainWindow", "Contact support")) self.actionAbout.setText(_translate("MainWindow", "About")) self.actionSettings.setText(_translate("MainWindow", "Settings")) - self.actionRegenerateDeterministicAddresses.setText(_translate("MainWindow", "Regenerate deterministic addresses")) + self.actionRegenerateDeterministicAddresses.setText( + _translate("MainWindow", "Regenerate deterministic addresses")) self.actionDeleteAllTrashedMessages.setText(_translate("MainWindow", "Delete all trashed messages")) self.actionJoinChan.setText(_translate("MainWindow", "Join / Create chan")) self.updateNetworkSwitchMenuLabel() diff --git a/src/bitmessageqt/blacklist.py b/src/bitmessageqt/blacklist.py index 87520c9225..bcfb49c334 100644 --- a/src/bitmessageqt/blacklist.py +++ b/src/bitmessageqt/blacklist.py @@ -27,7 +27,7 @@ def __init__(self, parent=None): self.tableWidgetBlacklist.itemChanged.connect(self.tableWidgetBlacklistItemChanged) # Set the icon sizes for the identicons - identicon_size = 3*7 + identicon_size = 3 * 7 self.tableWidgetBlacklist.setIconSize(QtCore.QSize(identicon_size, identicon_size)) self.UISignalThread = UISignaler.get() @@ -64,7 +64,7 @@ def click_pushButtonAddBlacklist(self): sql = '''select * from blacklist where address=?''' else: sql = '''select * from whitelist where address=?''' - queryreturn = sqlQuery(sql,*t) + queryreturn = sqlQuery(sql, *t) if queryreturn == []: self.tableWidgetBlacklist.setSortingEnabled(False) self.tableWidgetBlacklist.insertRow(0) @@ -106,10 +106,10 @@ def tableWidgetBlacklistItemChanged(self, item): if isinstance(addressitem, QtWidgets.QTableWidgetItem): if self.radioButtonBlacklist.isChecked(): sqlExecute('''UPDATE blacklist SET label=? WHERE address=?''', - str(item.text()), str(addressitem.text())) + str(item.text()), str(addressitem.text())) else: sqlExecute('''UPDATE whitelist SET label=? WHERE address=?''', - str(item.text()), str(addressitem.text())) + str(item.text()), str(addressitem.text())) def init_blacklist_popup_menu(self, connectSignal=True): # Popup menu for the Blacklist page diff --git a/src/bitmessageqt/dialogs.py b/src/bitmessageqt/dialogs.py index 9cea3fd828..401b8f08e7 100644 --- a/src/bitmessageqt/dialogs.py +++ b/src/bitmessageqt/dialogs.py @@ -27,6 +27,7 @@ class AboutDialog(QtWidgets.QDialog): """The `About` dialog""" + def __init__(self, parent=None): super(AboutDialog, self).__init__(parent) widgets.load('about.ui', self) @@ -55,6 +56,7 @@ def __init__(self, parent=None): class IconGlossaryDialog(QtWidgets.QDialog): """The `Icon Glossary` dialog, explaining the status icon colors""" + def __init__(self, parent=None, config=None): super(IconGlossaryDialog, self).__init__(parent) widgets.load('iconglossary.ui', self) @@ -71,6 +73,7 @@ def __init__(self, parent=None, config=None): class HelpDialog(QtWidgets.QDialog): """The `Help` dialog""" + def __init__(self, parent=None): super(HelpDialog, self).__init__(parent) widgets.load('help.ui', self) @@ -79,6 +82,7 @@ def __init__(self, parent=None): class ConnectDialog(QtWidgets.QDialog): """The `Connect` dialog""" + def __init__(self, parent=None): super(ConnectDialog, self).__init__(parent) widgets.load('connect.ui', self) diff --git a/src/bitmessageqt/foldertree.py b/src/bitmessageqt/foldertree.py index 896b355d53..b26d9861d1 100644 --- a/src/bitmessageqt/foldertree.py +++ b/src/bitmessageqt/foldertree.py @@ -219,6 +219,7 @@ def __lt__(self, other): class Ui_AddressWidget(BMTreeWidgetItem, SettingsMixin): """Item in the account/folder tree representing an account""" + def __init__(self, parent, pos=0, address=None, unreadCount=0, enabled=True): super(Ui_AddressWidget, self).__init__( parent, pos, address, unreadCount) @@ -297,6 +298,7 @@ def __lt__(self, other): class Ui_SubscriptionWidget(Ui_AddressWidget): """Special treating of subscription addresses""" # pylint: disable=unused-argument + def __init__(self, parent, pos=0, address="", unreadCount=0, label="", enabled=True): super(Ui_SubscriptionWidget, self).__init__( parent, pos, address, unreadCount, enabled) @@ -387,6 +389,7 @@ def data(self, role): class MessageList_AddressWidget(BMAddressWidget): """Address item in a messagelist""" + def __init__(self, address=None, label=None, unread=False): self.setAddress(address) super(MessageList_AddressWidget, self).__init__(label, unread) @@ -436,6 +439,7 @@ def __lt__(self, other): class MessageList_SubjectWidget(BMTableWidgetItem): """Message list subject item""" + def __init__(self, subject=None, label=None, unread=False): self.setSubject(subject) super(MessageList_SubjectWidget, self).__init__(label, unread) @@ -493,6 +497,7 @@ def data(self, role=QtCore.Qt.ItemDataRole.UserRole): class Ui_AddressBookWidgetItem(BMAddressWidget): """Addressbook item""" # pylint: disable=unused-argument + def __init__(self, label=None, acc_type=AccountMixin.NORMAL): self.type = acc_type super(Ui_AddressBookWidgetItem, self).__init__(label=label) @@ -535,6 +540,7 @@ def __lt__(self, other): class Ui_AddressBookWidgetItemLabel(Ui_AddressBookWidgetItem): """Addressbook label item""" + def __init__(self, address, label, acc_type): self.address = address super(Ui_AddressBookWidgetItemLabel, self).__init__(label, acc_type) @@ -547,6 +553,7 @@ def data(self, role): class Ui_AddressBookWidgetItemAddress(Ui_AddressBookWidgetItem): """Addressbook address item""" + def __init__(self, address, label, acc_type): self.address = address super(Ui_AddressBookWidgetItemAddress, self).__init__(address, acc_type) diff --git a/src/bitmessageqt/messagecompose.py b/src/bitmessageqt/messagecompose.py index 65fbddb6cf..9b2cb357f5 100644 --- a/src/bitmessageqt/messagecompose.py +++ b/src/bitmessageqt/messagecompose.py @@ -8,6 +8,7 @@ class MessageCompose(QtWidgets.QTextEdit): """Editor class with wheel zoom functionality""" + def __init__(self, parent=0): super(MessageCompose, self).__init__(parent) self.setAcceptRichText(False) diff --git a/src/bitmessageqt/messageview.py b/src/bitmessageqt/messageview.py index 350d0c7fe1..8c8b09ad6a 100644 --- a/src/bitmessageqt/messageview.py +++ b/src/bitmessageqt/messageview.py @@ -135,7 +135,7 @@ def showPlain(self): out = self.html.raw if self.html.has_html: out = "
" + QtWidgets.QApplication.translate( - "MessageView", "HTML detected, click here to display") + "

" + out + "MessageView", "HTML detected, click here to display") + "
" + out self.out = out self.outpos = 0 self.setHtml("") @@ -145,7 +145,8 @@ def showHTML(self): """Render message as HTML""" self.mode = MessageView.MODE_HTML out = self.html.sanitised - out = "
" + QtWidgets.QApplication.translate("MessageView", "Click here to disable HTML") + "

" + out + out = "
" + \ + QtWidgets.QApplication.translate("MessageView", "Click here to disable HTML") + "

" + out self.out = out self.outpos = 0 self.setHtml("") diff --git a/src/bitmessageqt/migrationwizard.py b/src/bitmessageqt/migrationwizard.py index d76661b57d..d6539d5a11 100644 --- a/src/bitmessageqt/migrationwizard.py +++ b/src/bitmessageqt/migrationwizard.py @@ -1,22 +1,23 @@ #!/usr/bin/env python2.7 from PyQt6 import QtCore, QtGui, QtWidgets + class MigrationWizardIntroPage(QtWidgets.QWizardPage): def __init__(self): super(QtGui.QWizardPage, self).__init__() self.setTitle("Migrating configuration") label = QtGui.QLabel("This wizard will help you to migrate your configuration. " - "You can still keep using PyBitMessage once you migrate, the changes are backwards compatible.") + "You can still keep using PyBitMessage once you migrate, the changes are backwards compatible.") label.setWordWrap(True) layout = QtGui.QVBoxLayout() layout.addWidget(label) self.setLayout(layout) - + def nextId(self): return 1 - + class MigrationWizardAddressesPage(QtWidgets.QWizardPage): def __init__(self, addresses): @@ -29,10 +30,10 @@ def __init__(self, addresses): layout = QtGui.QVBoxLayout() layout.addWidget(label) self.setLayout(layout) - + def nextId(self): return 10 - + class MigrationWizardGPUPage(QtWidgets.QWizardPage): def __init__(self): @@ -45,10 +46,10 @@ def __init__(self): layout = QtGui.QVBoxLayout() layout.addWidget(label) self.setLayout(layout) - + def nextId(self): return 10 - + class MigrationWizardConclusionPage(QtWidgets.QWizardPage): def __init__(self): @@ -68,7 +69,7 @@ def __init__(self, addresses): super(QtGui.QWizard, self).__init__() self.pages = {} - + page = MigrationWizardIntroPage() self.setPage(0, page) self.setStartId(0) diff --git a/src/bitmessageqt/networkstatus.py b/src/bitmessageqt/networkstatus.py index 32cb346902..f8f493f1be 100644 --- a/src/bitmessageqt/networkstatus.py +++ b/src/bitmessageqt/networkstatus.py @@ -18,6 +18,7 @@ class NetworkStatus(QtWidgets.QWidget, RetranslateMixin): """Network status tab""" + def __init__(self, parent=None): super(NetworkStatus, self).__init__(parent) widgets.load('networkstatus.ui', self) diff --git a/src/bitmessageqt/newchandialog.py b/src/bitmessageqt/newchandialog.py index e244f0bd01..0dd7784a8f 100644 --- a/src/bitmessageqt/newchandialog.py +++ b/src/bitmessageqt/newchandialog.py @@ -17,12 +17,13 @@ class NewChanDialog(QtWidgets.QDialog): """The `New Chan` dialog""" + def __init__(self, parent=None): super(NewChanDialog, self).__init__(parent) widgets.load('newchandialog.ui', self) self.parent = parent # XXX unresolved - #self.chanAddress.setValidator( + # self.chanAddress.setValidator( # AddressValidator( # self.chanAddress, # self.chanPassPhrase, @@ -30,7 +31,7 @@ def __init__(self, parent=None): # self.buttonBox, # False)) # XXX unresolved - #self.chanPassPhrase.setValidator( + # self.chanPassPhrase.setValidator( # PassPhraseValidator( # self.chanPassPhrase, # self.chanAddress, diff --git a/src/bitmessageqt/retranslateui.py b/src/bitmessageqt/retranslateui.py index 17dee2c705..e987378b66 100644 --- a/src/bitmessageqt/retranslateui.py +++ b/src/bitmessageqt/retranslateui.py @@ -3,6 +3,7 @@ from debug import logger import bitmessageqt.widgets as widgets + class RetranslateMixin(object): def retranslateUi(self): defaults = QtWidgets.QWidget() @@ -12,9 +13,9 @@ def retranslateUi(self): if callable(setTextMethod): getattr(self, attr).setText(getattr(defaults, attr).text()) elif isinstance(value, QtWidgets.QTableWidget): - for i in range (value.columnCount()): + for i in range(value.columnCount()): getattr(self, attr).horizontalHeaderItem(i).setText( getattr(defaults, attr).horizontalHeaderItem(i).text()) - for i in range (value.rowCount()): + for i in range(value.rowCount()): getattr(self, attr).verticalHeaderItem(i).setText( getattr(defaults, attr).verticalHeaderItem(i).text()) diff --git a/src/bitmessageqt/settings.py b/src/bitmessageqt/settings.py index 161acf695e..155bd56980 100644 --- a/src/bitmessageqt/settings.py +++ b/src/bitmessageqt/settings.py @@ -41,6 +41,7 @@ def getSOCKSProxyType(config): class SettingsDialog(QtWidgets.QDialog): """The "Settings" dialog""" + def __init__(self, parent=None, firstrun=False): super(SettingsDialog, self).__init__(parent) widgets.load('settings.ui', self) diff --git a/src/bitmessageqt/settingsmixin.py b/src/bitmessageqt/settingsmixin.py index fc78f79477..0e2d319bad 100644 --- a/src/bitmessageqt/settingsmixin.py +++ b/src/bitmessageqt/settingsmixin.py @@ -10,6 +10,7 @@ class SettingsMixin(object): """Mixin for adding geometry and state saving between restarts.""" + def warnIfNoObjectName(self): """ Handle objects which don't have a name. Currently it ignores them. Objects without a name can't have their @@ -58,6 +59,7 @@ def readState(self, target): class SMainWindow(QtWidgets.QMainWindow, SettingsMixin): """Main window with Settings functionality.""" + def loadSettings(self): """Load main window settings.""" self.readGeometry(self) @@ -72,6 +74,7 @@ def saveSettings(self): class STableWidget(QtWidgets.QTableWidget, SettingsMixin): """Table widget with Settings functionality""" # pylint: disable=too-many-ancestors + def loadSettings(self): """Load table settings.""" self.readState(self.horizontalHeader()) @@ -83,6 +86,7 @@ def saveSettings(self): class SSplitter(QtWidgets.QSplitter, SettingsMixin): """Splitter with Settings functionality.""" + def loadSettings(self): """Load splitter settings""" self.readState(self) @@ -95,6 +99,7 @@ def saveSettings(self): class STreeWidget(QtWidgets.QTreeWidget, SettingsMixin): """Tree widget with settings functionality.""" # pylint: disable=too-many-ancestors + def loadSettings(self): """Load tree settings.""" # recurse children diff --git a/src/bitmessageqt/utils.py b/src/bitmessageqt/utils.py index 4a5b5ee637..e6c2b66c01 100644 --- a/src/bitmessageqt/utils.py +++ b/src/bitmessageqt/utils.py @@ -89,7 +89,7 @@ def avatarize(address): # QImageReader.supportedImageFormats () extensions = [ 'PNG', 'GIF', 'JPG', 'JPEG', 'SVG', 'BMP', 'PBM', 'PGM', 'PPM', - 'XBM', 'XPM' ] + 'XBM', 'XPM'] # try to find a specific avatar for ext in extensions: lower_hash = state.appdata + 'avatars/' + icon_hash + '.' + ext.lower() diff --git a/src/bitmessageqt/widgets.py b/src/bitmessageqt/widgets.py index 6e9730a005..1ed2533a97 100644 --- a/src/bitmessageqt/widgets.py +++ b/src/bitmessageqt/widgets.py @@ -3,11 +3,13 @@ import paths import sys + def resource_path(resFile): baseDir = paths.codePath() for subDir in ["ui", "bitmessageqt"]: if os.path.isdir(os.path.join(baseDir, subDir)) and os.path.isfile(os.path.join(baseDir, subDir, resFile)): return os.path.join(baseDir, subDir, resFile) + def load(resFile, widget): uic.loadUi(resource_path(resFile), widget) From bcf02ff9bbf2619100df45039cf4f76cc20d857a Mon Sep 17 00:00:00 2001 From: Kashiko Koibumi Date: Fri, 17 May 2024 04:59:12 +0900 Subject: [PATCH 17/32] fix complains from flake8; part 2 --- run-autopep8.sh | 2 +- run-flake8.sh | 2 + src/bitmessageqt/__init__.py | 164 ++++++++++++++-------------- src/bitmessageqt/address_dialogs.py | 2 +- src/bitmessageqt/bitmessageui.py | 47 +++++--- src/bitmessageqt/dialogs.py | 2 +- src/bitmessageqt/languagebox.py | 2 +- src/bitmessageqt/messageview.py | 4 +- src/bitmessageqt/migrationwizard.py | 5 +- src/bitmessageqt/newchandialog.py | 5 +- src/bitmessageqt/retranslateui.py | 4 +- src/bitmessageqt/settingsmixin.py | 2 +- src/bitmessageqt/statusbar.py | 2 +- src/bitmessageqt/widgets.py | 1 - 14 files changed, 136 insertions(+), 108 deletions(-) create mode 100755 run-flake8.sh diff --git a/run-autopep8.sh b/run-autopep8.sh index 701a6c0d70..8fb0dab7a8 100755 --- a/run-autopep8.sh +++ b/run-autopep8.sh @@ -1,2 +1,2 @@ #!/bin/sh -autopep8 --in-place --recursive src src/bitmessageqt +autopep8 --in-place --recursive --max-line-length=119 src src/bitmessageqt diff --git a/run-flake8.sh b/run-flake8.sh new file mode 100755 index 0000000000..2158371791 --- /dev/null +++ b/run-flake8.sh @@ -0,0 +1,2 @@ +#!/bin/sh +flake8 --max-line-length=119 --config=setup.cfg src/*.py src/network/*.py src/storage/*.py src/bitmessageqt/*.py diff --git a/src/bitmessageqt/__init__.py b/src/bitmessageqt/__init__.py index dd922a25dc..56380fa0f5 100644 --- a/src/bitmessageqt/__init__.py +++ b/src/bitmessageqt/__init__.py @@ -16,8 +16,8 @@ from sqlite3 import register_adapter from PyQt6 import QtCore, QtGui, QtWidgets +from PyQt6.QtWidgets import QMessageBox from PyQt6.QtNetwork import QLocalSocket, QLocalServer - import shared import state from debug import logger @@ -613,9 +613,11 @@ def __init__(self, parent=None): "One of your addresses, {0}, is an old version 1 address. " "Version 1 addresses are no longer supported. " "May we delete it now?").format(addressInKeysFile) - reply = QtWidgets.QMessageBox.question( - self, 'Message', displayMsg, QtWidgets.QMessageBox.StandardButton.Yes, QtWidgets.QMessageBox.StandardButton.No) - if reply == QtWidgets.QMessageBox.StandardButton.Yes: + reply = QMessageBox.question( + self, 'Message', displayMsg, + QMessageBox.StandardButton.Yes, + QMessageBox.StandardButton.No) + if reply == QMessageBox.StandardButton.Yes: config.remove_section(addressInKeysFile) config.save() @@ -1502,11 +1504,11 @@ def handleKeyPress(self, event, focus=None): def click_actionManageKeys(self): if 'darwin' in sys.platform or 'linux' in sys.platform: if state.appdata == '': - # reply = QtWidgets.QMessageBox.information(self, 'keys.dat?','You + # reply = QMessageBox.information(self, 'keys.dat?','You # may manage your keys by editing the keys.dat file stored in # the same directory as this program. It is important that you # back up this file.', QMessageBox.StandardButton.Ok) - reply = QtWidgets.QMessageBox.information( + reply = QMessageBox.information( self, 'keys.dat?', _translate( @@ -1514,10 +1516,10 @@ def click_actionManageKeys(self): "You may manage your keys by editing the keys.dat file stored in the same directory" "as this program. It is important that you back up this file." ), - QtWidgets.QMessageBox.StandardButton.Ok) + QMessageBox.StandardButton.Ok) else: - QtWidgets.QMessageBox.information( + QMessageBox.information( self, 'keys.dat?', _translate( @@ -1526,10 +1528,10 @@ def click_actionManageKeys(self): "\n {0} \n" "It is important that you back up this file." ).format(state.appdata), - QtWidgets.QMessageBox.StandardButton.Ok) + QMessageBox.StandardButton.Ok) elif sys.platform == 'win32' or sys.platform == 'win64': if state.appdata == '': - reply = QtWidgets.QMessageBox.question( + reply = QMessageBox.question( self, _translate("MainWindow", "Open keys.dat?"), _translate( @@ -1538,10 +1540,10 @@ def click_actionManageKeys(self): "this program. It is important that you back up this file. " "Would you like to open the file now? " "(Be sure to close Bitmessage before making any changes.)"), - QtWidgets.QMessageBox.StandardButton.Yes, - QtWidgets.QMessageBox.StandardButton.No) + QMessageBox.StandardButton.Yes, + QMessageBox.StandardButton.No) else: - reply = QtWidgets.QMessageBox.question( + reply = QMessageBox.question( self, _translate("MainWindow", "Open keys.dat?"), _translate( @@ -1549,18 +1551,18 @@ def click_actionManageKeys(self): "You may manage your keys by editing the keys.dat file stored in\n {0} \n" "It is important that you back up this file. Would you like to open the file now?" "(Be sure to close Bitmessage before making any changes.)").format(state.appdata), - QtWidgets.QMessageBox.StandardButton.Yes, QtWidgets.QMessageBox.StandardButton.No) - if reply == QtWidgets.QMessageBox.StandardButton.Yes: + QMessageBox.StandardButton.Yes, QMessageBox.StandardButton.No) + if reply == QMessageBox.StandardButton.Yes: openKeysFile() # menu button 'delete all treshed messages' def click_actionDeleteAllTrashedMessages(self): - if QtWidgets.QMessageBox.question( + if QMessageBox.question( self, _translate("MainWindow", "Delete trash?"), _translate("MainWindow", "Are you sure you want to delete all trashed messages?"), - QtWidgets.QMessageBox.StandardButton.Yes, - QtWidgets.QMessageBox.StandardButton.No) == QtWidgets.QMessageBox.StandardButton.No: + QMessageBox.StandardButton.Yes, + QMessageBox.StandardButton.No) == QMessageBox.StandardButton.No: return sqlStoredProcedure('deleteandvacuume') self.rerenderTabTreeMessages() @@ -1587,7 +1589,7 @@ def click_actionRegenerateDeterministicAddresses(self): dialog = dialogs.RegenerateAddressesDialog(self) if dialog.exec(): if dialog.lineEditPassphrase.text() == "": - QtWidgets.QMessageBox.about( + QMessageBox.about( self, _translate("MainWindow", "bad passphrase"), _translate( "MainWindow", @@ -1600,7 +1602,7 @@ def click_actionRegenerateDeterministicAddresses(self): addressVersionNumber = int( dialog.lineEditAddressVersionNumber.text()) except: - QtWidgets.QMessageBox.about( + QMessageBox.about( self, _translate("MainWindow", "Bad address version number"), _translate( @@ -1610,7 +1612,7 @@ def click_actionRegenerateDeterministicAddresses(self): )) return if addressVersionNumber < 3 or addressVersionNumber > 4: - QtWidgets.QMessageBox.about( + QMessageBox.about( self, _translate("MainWindow", "Bad address version number"), _translate( @@ -1666,7 +1668,7 @@ def changeEvent(self, event): self.ui.blackwhitelist.init_blacklist_popup_menu(False) if event.type() == QtCore.QEvent.Type.WindowStateChange: if self.windowState() & QtCore.Qt.WindowState.WindowMinimized: - if config.getboolean('bitmessagesettings', 'minimizetotray') and not 'darwin' in sys.platform: + if config.getboolean('bitmessagesettings', 'minimizetotray') and 'darwin' not in sys.platform: QtCore.QTimer.singleShot(0, self.appIndicatorHide) elif event.oldState() & QtCore.Qt.WindowState.WindowMinimized: # The window state has just been changed to @@ -1899,7 +1901,7 @@ def newVersionAvailable(self, version): def displayAlert(self, title, text, exitAfterUserClicksOk): self.updateStatusBar(text) - QtWidgets.QMessageBox.critical(self, title, text, QtWidgets.QMessageBox.StandardButton.Ok) + QMessageBox.critical(self, title, text, QMessageBox.StandardButton.Ok) if exitAfterUserClicksOk: os._exit(0) @@ -1975,7 +1977,7 @@ def rerenderSubscriptions(self): self.rerenderTabTreeSubscriptions() def click_pushButtonTTL(self): - QtWidgets.QMessageBox.information( + QMessageBox.information( self, 'Time To Live', _translate( @@ -1984,7 +1986,7 @@ def click_pushButtonTTL(self): ,it will resend the message automatically. The longer the Time-To-Live, the more work your computer must do to send the message. A Time-To-Live of four or five days is often appropriate."""), - QtWidgets.QMessageBox.StandardButton.Ok) + QMessageBox.StandardButton.Ok) def click_pushButtonClear(self): self.ui.lineEditSubject.setText("") @@ -1997,7 +1999,9 @@ def click_pushButtonClear(self): self.ui.textEditMessageBroadcast.clear() def click_pushButtonSend(self): - encoding = 3 if QtWidgets.QApplication.queryKeyboardModifiers() & QtCore.Qt.KeyboardModifier.ShiftModifier else 2 + encoding = 2 + if QtWidgets.QApplication.queryKeyboardModifiers() & QtCore.Qt.KeyboardModifier.ShiftModifier: + encoding = 3 self.statusbar.clearMessage() @@ -2027,7 +2031,7 @@ def click_pushButtonSend(self): users can send messages of any length. """ if len(message) > (2 ** 18 - 500): - QtWidgets.QMessageBox.about( + QMessageBox.about( self, _translate("MainWindow", "Message too long"), _translate( "MainWindow", @@ -2059,14 +2063,15 @@ def click_pushButtonSend(self): subject = acct.subject toAddress = acct.toAddress else: - if QtWidgets.QMessageBox.question( + if QMessageBox.question( self, "Sending an email?", _translate( "MainWindow", "You are trying to send an email instead of a bitmessage. " "This requires registering with a gateway. Attempt to register?"), - QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No) != QtWidgets.QMessageBox.StandardButton.Yes: + QMessageBox.StandardButton.Yes + | QMessageBox.StandardButton.No) != QMessageBox.StandardButton.Yes: continue email = acct.getLabel() if email[-14:] != "@mailchuck.com": # attempt register @@ -2163,7 +2168,7 @@ def click_pushButtonSend(self): toAddress = addBMIfNotPresent(toAddress) if addressVersionNumber > 4 or addressVersionNumber <= 1: - QtWidgets.QMessageBox.about( + QMessageBox.about( self, _translate("MainWindow", "Address version number"), _translate( @@ -2173,7 +2178,7 @@ def click_pushButtonSend(self): ).format(toAddress, str(addressVersionNumber))) continue if streamNumber > 1 or streamNumber == 0: - QtWidgets.QMessageBox.about( + QMessageBox.about( self, _translate("MainWindow", "Stream number"), _translate( @@ -2582,13 +2587,13 @@ def on_action_EmailGatewayDialog(self): self.ui.textEditMessage.setFocus() def on_action_MarkAllRead(self): - if QtWidgets.QMessageBox.question( + if QMessageBox.question( self, "Marking all messages as read?", _translate( "MainWindow", "Are you sure you would like to mark all messages read?" - ), QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No - ) != QtWidgets.QMessageBox.StandardButton.Yes: + ), QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No + ) != QMessageBox.StandardButton.Yes: return tableWidget = self.getCurrentMessagelist() @@ -2599,7 +2604,7 @@ def on_action_MarkAllRead(self): msgids = [] for i in range(0, idCount): msgids.append(tableWidget.item(i, 3).data()) - for col in xrange(tableWidget.columnCount()): + for col in range(tableWidget.columnCount()): tableWidget.item(i, col).setUnread(False) markread = sqlExecuteChunked( @@ -2616,7 +2621,7 @@ def click_NewAddressDialog(self): def network_switch(self): dontconnect_option = not config.safeGetBoolean( 'bitmessagesettings', 'dontconnect') - reply = QtWidgets.QMessageBox.question( + reply = QMessageBox.question( self, _translate("MainWindow", "Disconnecting") if dontconnect_option else _translate("MainWindow", "Connecting"), _translate( @@ -2625,9 +2630,9 @@ def network_switch(self): ) if dontconnect_option else _translate( "MainWindow", "Bitmessage will now start connecting to network. Are you sure?" - ), QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.Cancel, - QtWidgets.QMessageBox.StandardButton.Cancel) - if reply != QtWidgets.QMessageBox.StandardButton.Yes: + ), QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.Cancel, + QMessageBox.StandardButton.Cancel) + if reply != QMessageBox.StandardButton.Yes: return config.set( 'bitmessagesettings', 'dontconnect', str(dontconnect_option)) @@ -2654,7 +2659,7 @@ def quit(self): # C PoW currently doesn't support interrupting and OpenCL is untested if getPowType() == "python" and (powQueueSize() > 0 or pendingUpload() > 0): - reply = QtWidgets.QMessageBox.question( + reply = QMessageBox.question( self, _translate("MainWindow", "Proof of work pending"), _translate( "MainWindow", @@ -2668,15 +2673,15 @@ def quit(self): ) + "\n\n" + _translate( "MainWindow", "Wait until these tasks finish?"), - QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No - | QtWidgets.QMessageBox.StandardButton.Cancel, QtWidgets.QMessageBox.StandardButton.Cancel) - if reply == QtWidgets.QMessageBox.StandardButton.No: + QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No + | QMessageBox.StandardButton.Cancel, QMessageBox.StandardButton.Cancel) + if reply == QMessageBox.StandardButton.No: waitForPow = False - elif reply == QtWidgets.QMessageBox.StandardButton.Cancel: + elif reply == QMessageBox.StandardButton.Cancel: return if pendingDownload() > 0: - reply = QtWidgets.QMessageBox.question( + reply = QMessageBox.question( self, _translate("MainWindow", "Synchronisation pending"), _translate( "MainWindow", @@ -2686,16 +2691,16 @@ def quit(self): " synchronisation finishes?", None, pendingDownload() ), - QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No - | QtWidgets.QMessageBox.StandardButton.Cancel, QtWidgets.QMessageBox.StandardButton.Cancel) - if reply == QtWidgets.QMessageBox.StandardButton.Yes: + QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No + | QMessageBox.StandardButton.Cancel, QMessageBox.StandardButton.Cancel) + if reply == QMessageBox.StandardButton.Yes: self.wait = waitForSync = True - elif reply == QtWidgets.QMessageBox.StandardButton.Cancel: + elif reply == QMessageBox.StandardButton.Cancel: return if state.statusIconColor == 'red' and not config.safeGetBoolean( 'bitmessagesettings', 'dontconnect'): - reply = QtWidgets.QMessageBox.question( + reply = QMessageBox.question( self, _translate("MainWindow", "Not connected"), _translate( "MainWindow", @@ -2703,12 +2708,12 @@ def quit(self): " quit now, it may cause delivery delays. Wait until" " connected and the synchronisation finishes?" ), - QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No - | QtWidgets.QMessageBox.StandardButton.Cancel, QtWidgets.QMessageBox.StandardButton.Cancel) - if reply == QtWidgets.QMessageBox.StandardButton.Yes: + QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No + | QMessageBox.StandardButton.Cancel, QMessageBox.StandardButton.Cancel) + if reply == QMessageBox.StandardButton.Yes: waitForConnection = True self.wait = waitForSync = True - elif reply == QtWidgets.QMessageBox.StandardButton.Cancel: + elif reply == QMessageBox.StandardButton.Cancel: return self.quitAccepted = True @@ -2850,7 +2855,7 @@ def on_action_InboxMessageForceHtml(self): lines = messageText.split('\n') totalLines = len(lines) - for i in xrange(totalLines): + for i in range(totalLines): if 'Message ostensibly from ' in lines[i]: lines[i] = '

%s

' % ( lines[i]) @@ -2916,7 +2921,8 @@ def quote_line(line): # Wrap and quote lines/paragraphs new to this message. else: return quoteWrapper.fill(line) - return '\n'.join([quote_line(l) for l in message.splitlines()]) + '\n\n' + return '\n'.join( + [quote_line(line) for line in message.splitlines()]) + '\n\n' def setSendFromComboBox(self, address=None): if address is None: @@ -2986,23 +2992,23 @@ def on_action_InboxReply(self, reply_type=None): ) # toAddressAtCurrentInboxRow = fromAddressAtCurrentInboxRow elif not config.has_section(toAddressAtCurrentInboxRow): - QtWidgets.QMessageBox.information( + QMessageBox.information( self, _translate("MainWindow", "Address is gone"), _translate( "MainWindow", "Bitmessage cannot find your address {0}. Perhaps you" " removed it?" - ).format(toAddressAtCurrentInboxRow), QtWidgets.QMessageBox.StandardButton.Ok) + ).format(toAddressAtCurrentInboxRow), QMessageBox.StandardButton.Ok) elif not config.getboolean( toAddressAtCurrentInboxRow, 'enabled'): - QtWidgets.QMessageBox.information( + QMessageBox.information( self, _translate("MainWindow", "Address disabled"), _translate( "MainWindow", "Error: The address from which you are trying to send" " is disabled. You\'ll have to enable it on the" " \'Your Identities\' tab before using it." - ), QtWidgets.QMessageBox.StandardButton.Ok) + ), QMessageBox.StandardButton.Ok) else: self.setBroadcastEnablementDependingOnWhetherThisIsAMailingListAddress(toAddressAtCurrentInboxRow) broadcast_tab_index = self.ui.tabWidgetSend.indexOf( @@ -3148,8 +3154,8 @@ def on_action_InboxTrash(self): idCount = len(inventoryHashesToTrash) sqlExecuteChunked( ("DELETE FROM inbox" if folder == "trash" or shifted else - "UPDATE inbox SET folder='trash', read=1") + - " WHERE msgid IN ({0})", idCount, *inventoryHashesToTrash) + "UPDATE inbox SET folder='trash', read=1") + + " WHERE msgid IN ({0})", idCount, *inventoryHashesToTrash) tableWidget.selectRow(0 if currentRow == 0 else currentRow - 1) tableWidget.setUpdatesEnabled(True) self.propagateUnreadCount(folder) @@ -3356,7 +3362,7 @@ def on_action_SubscriptionsNew(self): self.click_pushButtonAddSubscription() def on_action_SubscriptionsDelete(self): - if QtWidgets.QMessageBox.question( + if QMessageBox.question( self, "Delete subscription?", _translate( "MainWindow", @@ -3367,8 +3373,8 @@ def on_action_SubscriptionsDelete(self): " messages, but you can still view messages you" " already received.\n\nAre you sure you want to" " delete the subscription?" - ), QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No - ) != QtWidgets.QMessageBox.StandardButton.Yes: + ), QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No + ) != QMessageBox.StandardButton.Yes: return address = self.getCurrentAccount() sqlExecute('''DELETE FROM subscriptions WHERE address=?''', @@ -3591,7 +3597,7 @@ def on_action_YourIdentitiesDelete(self): if account.type == AccountMixin.NORMAL: return # maybe in the future elif account.type == AccountMixin.CHAN: - if QtWidgets.QMessageBox.question( + if QMessageBox.question( self, "Delete channel?", _translate( "MainWindow", @@ -3602,8 +3608,8 @@ def on_action_YourIdentitiesDelete(self): " messages, but you can still view messages you" " already received.\n\nAre you sure you want to" " delete the channel?" - ), QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No - ) == QtWidgets.QMessageBox.StandardButton.Yes: + ), QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No + ) == QMessageBox.StandardButton.Yes: config.remove_section(str(account.address)) else: return @@ -3739,11 +3745,11 @@ def setAvatar(self, addressAtCurrentRow): if exists | (len(current_files) > 0): displayMsg = _translate( "MainWindow", "Do you really want to remove this avatar?") - overwrite = QtWidgets.QMessageBox.question( + overwrite = QMessageBox.question( self, 'Message', displayMsg, - QtWidgets.QMessageBox.StandardButton.Yes, QtWidgets.QMessageBox.StandardButton.No) + QMessageBox.StandardButton.Yes, QMessageBox.StandardButton.No) else: - overwrite = QtWidgets.QMessageBox.StandardButton.No + overwrite = QMessageBox.StandardButton.No else: # ask whether to overwrite old avatar if exists | (len(current_files) > 0): @@ -3751,15 +3757,15 @@ def setAvatar(self, addressAtCurrentRow): "MainWindow", "You have already set an avatar for this address." " Do you really want to overwrite it?") - overwrite = QtWidgets.QMessageBox.question( + overwrite = QMessageBox.question( self, 'Message', displayMsg, - QtWidgets.QMessageBox.StandardButton.Yes, QtWidgets.QMessageBox.StandardButton.No) + QMessageBox.StandardButton.Yes, QMessageBox.StandardButton.No) else: - overwrite = QtWidgets.QMessageBox.StandardButton.No + overwrite = QMessageBox.StandardButton.No # copy the image file to the appdata folder - if (not exists) | (overwrite == QtWidgets.QMessageBox.StandardButton.Yes): - if overwrite == QtWidgets.QMessageBox.StandardButton.Yes: + if (not exists) | (overwrite == QMessageBox.StandardButton.Yes): + if overwrite == QMessageBox.StandardButton.Yes: for file in current_files: QtCore.QFile.remove(file) QtCore.QFile.remove(destination) @@ -3809,15 +3815,15 @@ def setAddressSound(self, addr): pattern = destfile.lower() for item in os.listdir(destdir): if item.lower() == pattern: - overwrite = QtWidgets.QMessageBox.question( + overwrite = QMessageBox.question( self, _translate("MainWindow", "Message"), _translate( "MainWindow", "You have already set a notification sound" " for this address book entry." " Do you really want to overwrite it?"), - QtWidgets.QMessageBox.StandardButton.Yes, QtWidgets.QMessageBox.StandardButton.No - ) == QtWidgets.QMessageBox.StandardButton.Yes + QMessageBox.StandardButton.Yes, QMessageBox.StandardButton.No + ) == QMessageBox.StandardButton.Yes if overwrite: QtCore.QFile.remove(os.path.join(destdir, item)) break diff --git a/src/bitmessageqt/address_dialogs.py b/src/bitmessageqt/address_dialogs.py index 30af4d9e14..937b7f8157 100644 --- a/src/bitmessageqt/address_dialogs.py +++ b/src/bitmessageqt/address_dialogs.py @@ -5,7 +5,7 @@ import hashlib -from PyQt6 import QtCore, QtGui, QtWidgets +from PyQt6 import QtGui, QtWidgets import queues import bitmessageqt.widgets as widgets diff --git a/src/bitmessageqt/bitmessageui.py b/src/bitmessageqt/bitmessageui.py index 268b4ae1b6..1f21ff3472 100644 --- a/src/bitmessageqt/bitmessageui.py +++ b/src/bitmessageqt/bitmessageui.py @@ -608,22 +608,41 @@ def retranslateUi(self, MainWindow): self.label_3.setText(_translate("MainWindow", "Subject:")) self.label_2.setText(_translate("MainWindow", "From:")) self.label.setText(_translate("MainWindow", "To:")) - self.textEditMessage.setHtml(_translate("MainWindow", "\n" - "\n" - "


")) - self.tabWidgetSend.setTabText(self.tabWidgetSend.indexOf(self.sendDirect), - _translate("MainWindow", "Send ordinary Message")) + self.textEditMessage.setHtml( + _translate("MainWindow", "\n" + "" + "\n" + "


")) + self.tabWidgetSend.setTabText( + self.tabWidgetSend.indexOf(self.sendDirect), + _translate("MainWindow", "Send ordinary Message")) self.label_8.setText(_translate("MainWindow", "From:")) self.label_7.setText(_translate("MainWindow", "Subject:")) - self.textEditMessageBroadcast.setHtml(_translate("MainWindow", "\n" - "\n" - "


")) - self.tabWidgetSend.setTabText(self.tabWidgetSend.indexOf(self.sendBroadcast), - _translate("MainWindow", "Send Message to your Subscribers")) + self.textEditMessageBroadcast.setHtml( + _translate("MainWindow", "\n" + "" + "\n" + "


")) + self.tabWidgetSend.setTabText( + self.tabWidgetSend.indexOf(self.sendBroadcast), + _translate("MainWindow", "Send Message to your Subscribers")) self.pushButtonTTL.setText(_translate("MainWindow", "TTL:")) self.pushButtonClear.setText(_translate("MainWindow", "Clear")) self.pushButtonSend.setText(_translate("MainWindow", "Send")) diff --git a/src/bitmessageqt/dialogs.py b/src/bitmessageqt/dialogs.py index 401b8f08e7..a7c0d94290 100644 --- a/src/bitmessageqt/dialogs.py +++ b/src/bitmessageqt/dialogs.py @@ -2,7 +2,7 @@ Custom dialog classes """ # pylint: disable=too-few-public-methods -from PyQt6 import QtGui, QtWidgets +from PyQt6 import QtWidgets import paths import bitmessageqt.widgets as widgets diff --git a/src/bitmessageqt/languagebox.py b/src/bitmessageqt/languagebox.py index 00ead98ae8..0277353455 100644 --- a/src/bitmessageqt/languagebox.py +++ b/src/bitmessageqt/languagebox.py @@ -3,7 +3,7 @@ import glob import os -from PyQt6 import QtCore, QtGui, QtWidgets +from PyQt6 import QtCore, QtWidgets import paths from bmconfigparser import config diff --git a/src/bitmessageqt/messageview.py b/src/bitmessageqt/messageview.py index 8c8b09ad6a..c77cc55d8f 100644 --- a/src/bitmessageqt/messageview.py +++ b/src/bitmessageqt/messageview.py @@ -38,7 +38,9 @@ def resizeEvent(self, event): def mousePressEvent(self, event): """Mouse press button event handler""" - if event.button() == QtCore.Qt.MouseButton.LeftButton and self.html and self.html.has_html and self.cursorForPosition( + b = event.button() + lb = QtCore.Qt.MouseButton.LeftButton + if b == lb and self.html and self.html.has_html and self.cursorForPosition( event.pos()).block().blockNumber() == 0: if self.mode == MessageView.MODE_PLAIN: self.showHTML() diff --git a/src/bitmessageqt/migrationwizard.py b/src/bitmessageqt/migrationwizard.py index d6539d5a11..4187ae85c1 100644 --- a/src/bitmessageqt/migrationwizard.py +++ b/src/bitmessageqt/migrationwizard.py @@ -1,5 +1,5 @@ #!/usr/bin/env python2.7 -from PyQt6 import QtCore, QtGui, QtWidgets +from PyQt6 import QtGui, QtWidgets class MigrationWizardIntroPage(QtWidgets.QWizardPage): @@ -8,7 +8,8 @@ def __init__(self): self.setTitle("Migrating configuration") label = QtGui.QLabel("This wizard will help you to migrate your configuration. " - "You can still keep using PyBitMessage once you migrate, the changes are backwards compatible.") + "You can still keep using PyBitMessage" + " once you migrate, the changes are backwards compatible.") label.setWordWrap(True) layout = QtGui.QVBoxLayout() diff --git a/src/bitmessageqt/newchandialog.py b/src/bitmessageqt/newchandialog.py index 0dd7784a8f..224bdc20c3 100644 --- a/src/bitmessageqt/newchandialog.py +++ b/src/bitmessageqt/newchandialog.py @@ -4,11 +4,12 @@ """ -from PyQt6 import QtCore, QtGui, QtWidgets +from PyQt6 import QtCore, QtWidgets import bitmessageqt.widgets as widgets from addresses import addBMIfNotPresent -from .addressvalidator import AddressValidator, PassPhraseValidator +# XXX unresolved +# from .addressvalidator import AddressValidator, PassPhraseValidator from queues import ( addressGeneratorQueue, apiAddressGeneratorReturnQueue, UISignalQueue) from tr import _translate diff --git a/src/bitmessageqt/retranslateui.py b/src/bitmessageqt/retranslateui.py index e987378b66..a382545f38 100644 --- a/src/bitmessageqt/retranslateui.py +++ b/src/bitmessageqt/retranslateui.py @@ -1,6 +1,4 @@ -from os import path -from PyQt6 import QtGui, QtWidgets -from debug import logger +from PyQt6 import QtWidgets import bitmessageqt.widgets as widgets diff --git a/src/bitmessageqt/settingsmixin.py b/src/bitmessageqt/settingsmixin.py index 0e2d319bad..3cc8dc389e 100644 --- a/src/bitmessageqt/settingsmixin.py +++ b/src/bitmessageqt/settingsmixin.py @@ -5,7 +5,7 @@ """ -from PyQt6 import QtCore, QtGui, QtWidgets +from PyQt6 import QtCore, QtWidgets class SettingsMixin(object): diff --git a/src/bitmessageqt/statusbar.py b/src/bitmessageqt/statusbar.py index a7162cc9aa..a3f4bf7997 100644 --- a/src/bitmessageqt/statusbar.py +++ b/src/bitmessageqt/statusbar.py @@ -2,7 +2,7 @@ """Status bar Module""" from time import time -from PyQt6 import QtGui, QtWidgets +from PyQt6 import QtWidgets class BMStatusBar(QtWidgets.QStatusBar): diff --git a/src/bitmessageqt/widgets.py b/src/bitmessageqt/widgets.py index 1ed2533a97..223c498b4b 100644 --- a/src/bitmessageqt/widgets.py +++ b/src/bitmessageqt/widgets.py @@ -1,7 +1,6 @@ from PyQt6 import uic import os.path import paths -import sys def resource_path(resFile): From 3b37faf8575d2946513f4f10c4e5827032e3a2cb Mon Sep 17 00:00:00 2001 From: Kashiko Koibumi Date: Fri, 17 May 2024 05:54:49 +0900 Subject: [PATCH 18/32] change command from python2.7 to python3 --- buildscripts/osx.sh | 2 +- packages/systemd/bitmessage.service | 2 +- src/bitmessagecli.py | 2 +- src/bitmessageqt/migrationwizard.py | 1 - src/bitmessageqt/settingsmixin.py | 1 - src/build_osx.py | 4 ++-- src/pybitmessage | 2 +- 7 files changed, 6 insertions(+), 8 deletions(-) diff --git a/buildscripts/osx.sh b/buildscripts/osx.sh index e58a49f4be..25c646b59f 100755 --- a/buildscripts/osx.sh +++ b/buildscripts/osx.sh @@ -16,7 +16,7 @@ echo "Creating OS X packages for Bitmessage." export PYBITMESSAGEVERSION=$1 -cd src && python2.7 build_osx.py py2app +cd src && python3 build_osx.py py2app if [[ $? = "0" ]]; then hdiutil create -fs HFS+ -volname "Bitmessage" -srcfolder dist/Bitmessage.app dist/bitmessage-v$1.dmg diff --git a/packages/systemd/bitmessage.service b/packages/systemd/bitmessage.service index 1a9f7f4770..66f04a7d5a 100644 --- a/packages/systemd/bitmessage.service +++ b/packages/systemd/bitmessage.service @@ -3,7 +3,7 @@ Description=Bitmessage Daemon After=network.target auditd.service [Service] -ExecStart=/usr/bin/python2 /usr/src/PyBitmessage/src/bitmessagemain.py +ExecStart=/usr/bin/python3 /usr/src/PyBitmessage/src/bitmessagemain.py ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure diff --git a/src/bitmessagecli.py b/src/bitmessagecli.py index 84c618afb6..10c8cd9b27 100644 --- a/src/bitmessagecli.py +++ b/src/bitmessagecli.py @@ -1,4 +1,4 @@ -#!/usr/bin/python2.7 +#!/usr/bin/python3 # -*- coding: utf-8 -*- # pylint: disable=too-many-lines,global-statement,too-many-branches,too-many-statements,inconsistent-return-statements # pylint: disable=too-many-nested-blocks,too-many-locals,protected-access,too-many-arguments,too-many-function-args diff --git a/src/bitmessageqt/migrationwizard.py b/src/bitmessageqt/migrationwizard.py index 4187ae85c1..e51a0e69a2 100644 --- a/src/bitmessageqt/migrationwizard.py +++ b/src/bitmessageqt/migrationwizard.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python2.7 from PyQt6 import QtGui, QtWidgets diff --git a/src/bitmessageqt/settingsmixin.py b/src/bitmessageqt/settingsmixin.py index 3cc8dc389e..836e022092 100644 --- a/src/bitmessageqt/settingsmixin.py +++ b/src/bitmessageqt/settingsmixin.py @@ -1,4 +1,3 @@ -#!/usr/bin/python2.7 """ src/settingsmixin.py ==================== diff --git a/src/build_osx.py b/src/build_osx.py index d83e9b9bc9..922680d2f8 100644 --- a/src/build_osx.py +++ b/src/build_osx.py @@ -1,7 +1,7 @@ """Building osx.""" import os from glob import glob -from PyQt4 import QtCore +from PyQt6 import QtCore from setuptools import setup name = "Bitmessage" @@ -32,7 +32,7 @@ setup_requires=["py2app"], options=dict( py2app=dict( - includes=['sip', 'PyQt4._qt'], + includes=['sip', 'PyQt6._qt'], iconfile="images/bitmessage.icns" ) ) diff --git a/src/pybitmessage b/src/pybitmessage index decebfff74..46a8f75cc7 100644 --- a/src/pybitmessage +++ b/src/pybitmessage @@ -1,4 +1,4 @@ -#!/usr/bin/python2.7 +#!/usr/bin/python3 import os import pkg_resources From 416463f8b780885c45975e835314350de250bb47 Mon Sep 17 00:00:00 2001 From: Kashiko Koibumi Date: Fri, 17 May 2024 11:50:49 +0900 Subject: [PATCH 19/32] Revert "change command from python2.7 to python3" This reverts commit 3b37faf8575d2946513f4f10c4e5827032e3a2cb. --- buildscripts/osx.sh | 2 +- packages/systemd/bitmessage.service | 2 +- src/bitmessagecli.py | 2 +- src/bitmessageqt/migrationwizard.py | 1 + src/bitmessageqt/settingsmixin.py | 1 + src/build_osx.py | 4 ++-- src/pybitmessage | 2 +- 7 files changed, 8 insertions(+), 6 deletions(-) diff --git a/buildscripts/osx.sh b/buildscripts/osx.sh index 25c646b59f..e58a49f4be 100755 --- a/buildscripts/osx.sh +++ b/buildscripts/osx.sh @@ -16,7 +16,7 @@ echo "Creating OS X packages for Bitmessage." export PYBITMESSAGEVERSION=$1 -cd src && python3 build_osx.py py2app +cd src && python2.7 build_osx.py py2app if [[ $? = "0" ]]; then hdiutil create -fs HFS+ -volname "Bitmessage" -srcfolder dist/Bitmessage.app dist/bitmessage-v$1.dmg diff --git a/packages/systemd/bitmessage.service b/packages/systemd/bitmessage.service index 66f04a7d5a..1a9f7f4770 100644 --- a/packages/systemd/bitmessage.service +++ b/packages/systemd/bitmessage.service @@ -3,7 +3,7 @@ Description=Bitmessage Daemon After=network.target auditd.service [Service] -ExecStart=/usr/bin/python3 /usr/src/PyBitmessage/src/bitmessagemain.py +ExecStart=/usr/bin/python2 /usr/src/PyBitmessage/src/bitmessagemain.py ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure diff --git a/src/bitmessagecli.py b/src/bitmessagecli.py index 10c8cd9b27..84c618afb6 100644 --- a/src/bitmessagecli.py +++ b/src/bitmessagecli.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/python2.7 # -*- coding: utf-8 -*- # pylint: disable=too-many-lines,global-statement,too-many-branches,too-many-statements,inconsistent-return-statements # pylint: disable=too-many-nested-blocks,too-many-locals,protected-access,too-many-arguments,too-many-function-args diff --git a/src/bitmessageqt/migrationwizard.py b/src/bitmessageqt/migrationwizard.py index e51a0e69a2..4187ae85c1 100644 --- a/src/bitmessageqt/migrationwizard.py +++ b/src/bitmessageqt/migrationwizard.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python2.7 from PyQt6 import QtGui, QtWidgets diff --git a/src/bitmessageqt/settingsmixin.py b/src/bitmessageqt/settingsmixin.py index 836e022092..3cc8dc389e 100644 --- a/src/bitmessageqt/settingsmixin.py +++ b/src/bitmessageqt/settingsmixin.py @@ -1,3 +1,4 @@ +#!/usr/bin/python2.7 """ src/settingsmixin.py ==================== diff --git a/src/build_osx.py b/src/build_osx.py index 922680d2f8..d83e9b9bc9 100644 --- a/src/build_osx.py +++ b/src/build_osx.py @@ -1,7 +1,7 @@ """Building osx.""" import os from glob import glob -from PyQt6 import QtCore +from PyQt4 import QtCore from setuptools import setup name = "Bitmessage" @@ -32,7 +32,7 @@ setup_requires=["py2app"], options=dict( py2app=dict( - includes=['sip', 'PyQt6._qt'], + includes=['sip', 'PyQt4._qt'], iconfile="images/bitmessage.icns" ) ) diff --git a/src/pybitmessage b/src/pybitmessage index 46a8f75cc7..decebfff74 100644 --- a/src/pybitmessage +++ b/src/pybitmessage @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/python2.7 import os import pkg_resources From 1077548eb6a571c42937d08c0d645a79401382e6 Mon Sep 17 00:00:00 2001 From: Kashiko Koibumi Date: Fri, 17 May 2024 11:51:03 +0900 Subject: [PATCH 20/32] Revert "fix complains from flake8; part 2" This reverts commit bcf02ff9bbf2619100df45039cf4f76cc20d857a. --- run-autopep8.sh | 2 +- run-flake8.sh | 2 - src/bitmessageqt/__init__.py | 164 ++++++++++++++-------------- src/bitmessageqt/address_dialogs.py | 2 +- src/bitmessageqt/bitmessageui.py | 47 +++----- src/bitmessageqt/dialogs.py | 2 +- src/bitmessageqt/languagebox.py | 2 +- src/bitmessageqt/messageview.py | 4 +- src/bitmessageqt/migrationwizard.py | 5 +- src/bitmessageqt/newchandialog.py | 5 +- src/bitmessageqt/retranslateui.py | 4 +- src/bitmessageqt/settingsmixin.py | 2 +- src/bitmessageqt/statusbar.py | 2 +- src/bitmessageqt/widgets.py | 1 + 14 files changed, 108 insertions(+), 136 deletions(-) delete mode 100755 run-flake8.sh diff --git a/run-autopep8.sh b/run-autopep8.sh index 8fb0dab7a8..701a6c0d70 100755 --- a/run-autopep8.sh +++ b/run-autopep8.sh @@ -1,2 +1,2 @@ #!/bin/sh -autopep8 --in-place --recursive --max-line-length=119 src src/bitmessageqt +autopep8 --in-place --recursive src src/bitmessageqt diff --git a/run-flake8.sh b/run-flake8.sh deleted file mode 100755 index 2158371791..0000000000 --- a/run-flake8.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -flake8 --max-line-length=119 --config=setup.cfg src/*.py src/network/*.py src/storage/*.py src/bitmessageqt/*.py diff --git a/src/bitmessageqt/__init__.py b/src/bitmessageqt/__init__.py index 56380fa0f5..dd922a25dc 100644 --- a/src/bitmessageqt/__init__.py +++ b/src/bitmessageqt/__init__.py @@ -16,8 +16,8 @@ from sqlite3 import register_adapter from PyQt6 import QtCore, QtGui, QtWidgets -from PyQt6.QtWidgets import QMessageBox from PyQt6.QtNetwork import QLocalSocket, QLocalServer + import shared import state from debug import logger @@ -613,11 +613,9 @@ def __init__(self, parent=None): "One of your addresses, {0}, is an old version 1 address. " "Version 1 addresses are no longer supported. " "May we delete it now?").format(addressInKeysFile) - reply = QMessageBox.question( - self, 'Message', displayMsg, - QMessageBox.StandardButton.Yes, - QMessageBox.StandardButton.No) - if reply == QMessageBox.StandardButton.Yes: + reply = QtWidgets.QMessageBox.question( + self, 'Message', displayMsg, QtWidgets.QMessageBox.StandardButton.Yes, QtWidgets.QMessageBox.StandardButton.No) + if reply == QtWidgets.QMessageBox.StandardButton.Yes: config.remove_section(addressInKeysFile) config.save() @@ -1504,11 +1502,11 @@ def handleKeyPress(self, event, focus=None): def click_actionManageKeys(self): if 'darwin' in sys.platform or 'linux' in sys.platform: if state.appdata == '': - # reply = QMessageBox.information(self, 'keys.dat?','You + # reply = QtWidgets.QMessageBox.information(self, 'keys.dat?','You # may manage your keys by editing the keys.dat file stored in # the same directory as this program. It is important that you # back up this file.', QMessageBox.StandardButton.Ok) - reply = QMessageBox.information( + reply = QtWidgets.QMessageBox.information( self, 'keys.dat?', _translate( @@ -1516,10 +1514,10 @@ def click_actionManageKeys(self): "You may manage your keys by editing the keys.dat file stored in the same directory" "as this program. It is important that you back up this file." ), - QMessageBox.StandardButton.Ok) + QtWidgets.QMessageBox.StandardButton.Ok) else: - QMessageBox.information( + QtWidgets.QMessageBox.information( self, 'keys.dat?', _translate( @@ -1528,10 +1526,10 @@ def click_actionManageKeys(self): "\n {0} \n" "It is important that you back up this file." ).format(state.appdata), - QMessageBox.StandardButton.Ok) + QtWidgets.QMessageBox.StandardButton.Ok) elif sys.platform == 'win32' or sys.platform == 'win64': if state.appdata == '': - reply = QMessageBox.question( + reply = QtWidgets.QMessageBox.question( self, _translate("MainWindow", "Open keys.dat?"), _translate( @@ -1540,10 +1538,10 @@ def click_actionManageKeys(self): "this program. It is important that you back up this file. " "Would you like to open the file now? " "(Be sure to close Bitmessage before making any changes.)"), - QMessageBox.StandardButton.Yes, - QMessageBox.StandardButton.No) + QtWidgets.QMessageBox.StandardButton.Yes, + QtWidgets.QMessageBox.StandardButton.No) else: - reply = QMessageBox.question( + reply = QtWidgets.QMessageBox.question( self, _translate("MainWindow", "Open keys.dat?"), _translate( @@ -1551,18 +1549,18 @@ def click_actionManageKeys(self): "You may manage your keys by editing the keys.dat file stored in\n {0} \n" "It is important that you back up this file. Would you like to open the file now?" "(Be sure to close Bitmessage before making any changes.)").format(state.appdata), - QMessageBox.StandardButton.Yes, QMessageBox.StandardButton.No) - if reply == QMessageBox.StandardButton.Yes: + QtWidgets.QMessageBox.StandardButton.Yes, QtWidgets.QMessageBox.StandardButton.No) + if reply == QtWidgets.QMessageBox.StandardButton.Yes: openKeysFile() # menu button 'delete all treshed messages' def click_actionDeleteAllTrashedMessages(self): - if QMessageBox.question( + if QtWidgets.QMessageBox.question( self, _translate("MainWindow", "Delete trash?"), _translate("MainWindow", "Are you sure you want to delete all trashed messages?"), - QMessageBox.StandardButton.Yes, - QMessageBox.StandardButton.No) == QMessageBox.StandardButton.No: + QtWidgets.QMessageBox.StandardButton.Yes, + QtWidgets.QMessageBox.StandardButton.No) == QtWidgets.QMessageBox.StandardButton.No: return sqlStoredProcedure('deleteandvacuume') self.rerenderTabTreeMessages() @@ -1589,7 +1587,7 @@ def click_actionRegenerateDeterministicAddresses(self): dialog = dialogs.RegenerateAddressesDialog(self) if dialog.exec(): if dialog.lineEditPassphrase.text() == "": - QMessageBox.about( + QtWidgets.QMessageBox.about( self, _translate("MainWindow", "bad passphrase"), _translate( "MainWindow", @@ -1602,7 +1600,7 @@ def click_actionRegenerateDeterministicAddresses(self): addressVersionNumber = int( dialog.lineEditAddressVersionNumber.text()) except: - QMessageBox.about( + QtWidgets.QMessageBox.about( self, _translate("MainWindow", "Bad address version number"), _translate( @@ -1612,7 +1610,7 @@ def click_actionRegenerateDeterministicAddresses(self): )) return if addressVersionNumber < 3 or addressVersionNumber > 4: - QMessageBox.about( + QtWidgets.QMessageBox.about( self, _translate("MainWindow", "Bad address version number"), _translate( @@ -1668,7 +1666,7 @@ def changeEvent(self, event): self.ui.blackwhitelist.init_blacklist_popup_menu(False) if event.type() == QtCore.QEvent.Type.WindowStateChange: if self.windowState() & QtCore.Qt.WindowState.WindowMinimized: - if config.getboolean('bitmessagesettings', 'minimizetotray') and 'darwin' not in sys.platform: + if config.getboolean('bitmessagesettings', 'minimizetotray') and not 'darwin' in sys.platform: QtCore.QTimer.singleShot(0, self.appIndicatorHide) elif event.oldState() & QtCore.Qt.WindowState.WindowMinimized: # The window state has just been changed to @@ -1901,7 +1899,7 @@ def newVersionAvailable(self, version): def displayAlert(self, title, text, exitAfterUserClicksOk): self.updateStatusBar(text) - QMessageBox.critical(self, title, text, QMessageBox.StandardButton.Ok) + QtWidgets.QMessageBox.critical(self, title, text, QtWidgets.QMessageBox.StandardButton.Ok) if exitAfterUserClicksOk: os._exit(0) @@ -1977,7 +1975,7 @@ def rerenderSubscriptions(self): self.rerenderTabTreeSubscriptions() def click_pushButtonTTL(self): - QMessageBox.information( + QtWidgets.QMessageBox.information( self, 'Time To Live', _translate( @@ -1986,7 +1984,7 @@ def click_pushButtonTTL(self): ,it will resend the message automatically. The longer the Time-To-Live, the more work your computer must do to send the message. A Time-To-Live of four or five days is often appropriate."""), - QMessageBox.StandardButton.Ok) + QtWidgets.QMessageBox.StandardButton.Ok) def click_pushButtonClear(self): self.ui.lineEditSubject.setText("") @@ -1999,9 +1997,7 @@ def click_pushButtonClear(self): self.ui.textEditMessageBroadcast.clear() def click_pushButtonSend(self): - encoding = 2 - if QtWidgets.QApplication.queryKeyboardModifiers() & QtCore.Qt.KeyboardModifier.ShiftModifier: - encoding = 3 + encoding = 3 if QtWidgets.QApplication.queryKeyboardModifiers() & QtCore.Qt.KeyboardModifier.ShiftModifier else 2 self.statusbar.clearMessage() @@ -2031,7 +2027,7 @@ def click_pushButtonSend(self): users can send messages of any length. """ if len(message) > (2 ** 18 - 500): - QMessageBox.about( + QtWidgets.QMessageBox.about( self, _translate("MainWindow", "Message too long"), _translate( "MainWindow", @@ -2063,15 +2059,14 @@ def click_pushButtonSend(self): subject = acct.subject toAddress = acct.toAddress else: - if QMessageBox.question( + if QtWidgets.QMessageBox.question( self, "Sending an email?", _translate( "MainWindow", "You are trying to send an email instead of a bitmessage. " "This requires registering with a gateway. Attempt to register?"), - QMessageBox.StandardButton.Yes - | QMessageBox.StandardButton.No) != QMessageBox.StandardButton.Yes: + QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No) != QtWidgets.QMessageBox.StandardButton.Yes: continue email = acct.getLabel() if email[-14:] != "@mailchuck.com": # attempt register @@ -2168,7 +2163,7 @@ def click_pushButtonSend(self): toAddress = addBMIfNotPresent(toAddress) if addressVersionNumber > 4 or addressVersionNumber <= 1: - QMessageBox.about( + QtWidgets.QMessageBox.about( self, _translate("MainWindow", "Address version number"), _translate( @@ -2178,7 +2173,7 @@ def click_pushButtonSend(self): ).format(toAddress, str(addressVersionNumber))) continue if streamNumber > 1 or streamNumber == 0: - QMessageBox.about( + QtWidgets.QMessageBox.about( self, _translate("MainWindow", "Stream number"), _translate( @@ -2587,13 +2582,13 @@ def on_action_EmailGatewayDialog(self): self.ui.textEditMessage.setFocus() def on_action_MarkAllRead(self): - if QMessageBox.question( + if QtWidgets.QMessageBox.question( self, "Marking all messages as read?", _translate( "MainWindow", "Are you sure you would like to mark all messages read?" - ), QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No - ) != QMessageBox.StandardButton.Yes: + ), QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No + ) != QtWidgets.QMessageBox.StandardButton.Yes: return tableWidget = self.getCurrentMessagelist() @@ -2604,7 +2599,7 @@ def on_action_MarkAllRead(self): msgids = [] for i in range(0, idCount): msgids.append(tableWidget.item(i, 3).data()) - for col in range(tableWidget.columnCount()): + for col in xrange(tableWidget.columnCount()): tableWidget.item(i, col).setUnread(False) markread = sqlExecuteChunked( @@ -2621,7 +2616,7 @@ def click_NewAddressDialog(self): def network_switch(self): dontconnect_option = not config.safeGetBoolean( 'bitmessagesettings', 'dontconnect') - reply = QMessageBox.question( + reply = QtWidgets.QMessageBox.question( self, _translate("MainWindow", "Disconnecting") if dontconnect_option else _translate("MainWindow", "Connecting"), _translate( @@ -2630,9 +2625,9 @@ def network_switch(self): ) if dontconnect_option else _translate( "MainWindow", "Bitmessage will now start connecting to network. Are you sure?" - ), QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.Cancel, - QMessageBox.StandardButton.Cancel) - if reply != QMessageBox.StandardButton.Yes: + ), QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.Cancel, + QtWidgets.QMessageBox.StandardButton.Cancel) + if reply != QtWidgets.QMessageBox.StandardButton.Yes: return config.set( 'bitmessagesettings', 'dontconnect', str(dontconnect_option)) @@ -2659,7 +2654,7 @@ def quit(self): # C PoW currently doesn't support interrupting and OpenCL is untested if getPowType() == "python" and (powQueueSize() > 0 or pendingUpload() > 0): - reply = QMessageBox.question( + reply = QtWidgets.QMessageBox.question( self, _translate("MainWindow", "Proof of work pending"), _translate( "MainWindow", @@ -2673,15 +2668,15 @@ def quit(self): ) + "\n\n" + _translate( "MainWindow", "Wait until these tasks finish?"), - QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No - | QMessageBox.StandardButton.Cancel, QMessageBox.StandardButton.Cancel) - if reply == QMessageBox.StandardButton.No: + QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No + | QtWidgets.QMessageBox.StandardButton.Cancel, QtWidgets.QMessageBox.StandardButton.Cancel) + if reply == QtWidgets.QMessageBox.StandardButton.No: waitForPow = False - elif reply == QMessageBox.StandardButton.Cancel: + elif reply == QtWidgets.QMessageBox.StandardButton.Cancel: return if pendingDownload() > 0: - reply = QMessageBox.question( + reply = QtWidgets.QMessageBox.question( self, _translate("MainWindow", "Synchronisation pending"), _translate( "MainWindow", @@ -2691,16 +2686,16 @@ def quit(self): " synchronisation finishes?", None, pendingDownload() ), - QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No - | QMessageBox.StandardButton.Cancel, QMessageBox.StandardButton.Cancel) - if reply == QMessageBox.StandardButton.Yes: + QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No + | QtWidgets.QMessageBox.StandardButton.Cancel, QtWidgets.QMessageBox.StandardButton.Cancel) + if reply == QtWidgets.QMessageBox.StandardButton.Yes: self.wait = waitForSync = True - elif reply == QMessageBox.StandardButton.Cancel: + elif reply == QtWidgets.QMessageBox.StandardButton.Cancel: return if state.statusIconColor == 'red' and not config.safeGetBoolean( 'bitmessagesettings', 'dontconnect'): - reply = QMessageBox.question( + reply = QtWidgets.QMessageBox.question( self, _translate("MainWindow", "Not connected"), _translate( "MainWindow", @@ -2708,12 +2703,12 @@ def quit(self): " quit now, it may cause delivery delays. Wait until" " connected and the synchronisation finishes?" ), - QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No - | QMessageBox.StandardButton.Cancel, QMessageBox.StandardButton.Cancel) - if reply == QMessageBox.StandardButton.Yes: + QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No + | QtWidgets.QMessageBox.StandardButton.Cancel, QtWidgets.QMessageBox.StandardButton.Cancel) + if reply == QtWidgets.QMessageBox.StandardButton.Yes: waitForConnection = True self.wait = waitForSync = True - elif reply == QMessageBox.StandardButton.Cancel: + elif reply == QtWidgets.QMessageBox.StandardButton.Cancel: return self.quitAccepted = True @@ -2855,7 +2850,7 @@ def on_action_InboxMessageForceHtml(self): lines = messageText.split('\n') totalLines = len(lines) - for i in range(totalLines): + for i in xrange(totalLines): if 'Message ostensibly from ' in lines[i]: lines[i] = '

%s

' % ( lines[i]) @@ -2921,8 +2916,7 @@ def quote_line(line): # Wrap and quote lines/paragraphs new to this message. else: return quoteWrapper.fill(line) - return '\n'.join( - [quote_line(line) for line in message.splitlines()]) + '\n\n' + return '\n'.join([quote_line(l) for l in message.splitlines()]) + '\n\n' def setSendFromComboBox(self, address=None): if address is None: @@ -2992,23 +2986,23 @@ def on_action_InboxReply(self, reply_type=None): ) # toAddressAtCurrentInboxRow = fromAddressAtCurrentInboxRow elif not config.has_section(toAddressAtCurrentInboxRow): - QMessageBox.information( + QtWidgets.QMessageBox.information( self, _translate("MainWindow", "Address is gone"), _translate( "MainWindow", "Bitmessage cannot find your address {0}. Perhaps you" " removed it?" - ).format(toAddressAtCurrentInboxRow), QMessageBox.StandardButton.Ok) + ).format(toAddressAtCurrentInboxRow), QtWidgets.QMessageBox.StandardButton.Ok) elif not config.getboolean( toAddressAtCurrentInboxRow, 'enabled'): - QMessageBox.information( + QtWidgets.QMessageBox.information( self, _translate("MainWindow", "Address disabled"), _translate( "MainWindow", "Error: The address from which you are trying to send" " is disabled. You\'ll have to enable it on the" " \'Your Identities\' tab before using it." - ), QMessageBox.StandardButton.Ok) + ), QtWidgets.QMessageBox.StandardButton.Ok) else: self.setBroadcastEnablementDependingOnWhetherThisIsAMailingListAddress(toAddressAtCurrentInboxRow) broadcast_tab_index = self.ui.tabWidgetSend.indexOf( @@ -3154,8 +3148,8 @@ def on_action_InboxTrash(self): idCount = len(inventoryHashesToTrash) sqlExecuteChunked( ("DELETE FROM inbox" if folder == "trash" or shifted else - "UPDATE inbox SET folder='trash', read=1") - + " WHERE msgid IN ({0})", idCount, *inventoryHashesToTrash) + "UPDATE inbox SET folder='trash', read=1") + + " WHERE msgid IN ({0})", idCount, *inventoryHashesToTrash) tableWidget.selectRow(0 if currentRow == 0 else currentRow - 1) tableWidget.setUpdatesEnabled(True) self.propagateUnreadCount(folder) @@ -3362,7 +3356,7 @@ def on_action_SubscriptionsNew(self): self.click_pushButtonAddSubscription() def on_action_SubscriptionsDelete(self): - if QMessageBox.question( + if QtWidgets.QMessageBox.question( self, "Delete subscription?", _translate( "MainWindow", @@ -3373,8 +3367,8 @@ def on_action_SubscriptionsDelete(self): " messages, but you can still view messages you" " already received.\n\nAre you sure you want to" " delete the subscription?" - ), QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No - ) != QMessageBox.StandardButton.Yes: + ), QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No + ) != QtWidgets.QMessageBox.StandardButton.Yes: return address = self.getCurrentAccount() sqlExecute('''DELETE FROM subscriptions WHERE address=?''', @@ -3597,7 +3591,7 @@ def on_action_YourIdentitiesDelete(self): if account.type == AccountMixin.NORMAL: return # maybe in the future elif account.type == AccountMixin.CHAN: - if QMessageBox.question( + if QtWidgets.QMessageBox.question( self, "Delete channel?", _translate( "MainWindow", @@ -3608,8 +3602,8 @@ def on_action_YourIdentitiesDelete(self): " messages, but you can still view messages you" " already received.\n\nAre you sure you want to" " delete the channel?" - ), QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No - ) == QMessageBox.StandardButton.Yes: + ), QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No + ) == QtWidgets.QMessageBox.StandardButton.Yes: config.remove_section(str(account.address)) else: return @@ -3745,11 +3739,11 @@ def setAvatar(self, addressAtCurrentRow): if exists | (len(current_files) > 0): displayMsg = _translate( "MainWindow", "Do you really want to remove this avatar?") - overwrite = QMessageBox.question( + overwrite = QtWidgets.QMessageBox.question( self, 'Message', displayMsg, - QMessageBox.StandardButton.Yes, QMessageBox.StandardButton.No) + QtWidgets.QMessageBox.StandardButton.Yes, QtWidgets.QMessageBox.StandardButton.No) else: - overwrite = QMessageBox.StandardButton.No + overwrite = QtWidgets.QMessageBox.StandardButton.No else: # ask whether to overwrite old avatar if exists | (len(current_files) > 0): @@ -3757,15 +3751,15 @@ def setAvatar(self, addressAtCurrentRow): "MainWindow", "You have already set an avatar for this address." " Do you really want to overwrite it?") - overwrite = QMessageBox.question( + overwrite = QtWidgets.QMessageBox.question( self, 'Message', displayMsg, - QMessageBox.StandardButton.Yes, QMessageBox.StandardButton.No) + QtWidgets.QMessageBox.StandardButton.Yes, QtWidgets.QMessageBox.StandardButton.No) else: - overwrite = QMessageBox.StandardButton.No + overwrite = QtWidgets.QMessageBox.StandardButton.No # copy the image file to the appdata folder - if (not exists) | (overwrite == QMessageBox.StandardButton.Yes): - if overwrite == QMessageBox.StandardButton.Yes: + if (not exists) | (overwrite == QtWidgets.QMessageBox.StandardButton.Yes): + if overwrite == QtWidgets.QMessageBox.StandardButton.Yes: for file in current_files: QtCore.QFile.remove(file) QtCore.QFile.remove(destination) @@ -3815,15 +3809,15 @@ def setAddressSound(self, addr): pattern = destfile.lower() for item in os.listdir(destdir): if item.lower() == pattern: - overwrite = QMessageBox.question( + overwrite = QtWidgets.QMessageBox.question( self, _translate("MainWindow", "Message"), _translate( "MainWindow", "You have already set a notification sound" " for this address book entry." " Do you really want to overwrite it?"), - QMessageBox.StandardButton.Yes, QMessageBox.StandardButton.No - ) == QMessageBox.StandardButton.Yes + QtWidgets.QMessageBox.StandardButton.Yes, QtWidgets.QMessageBox.StandardButton.No + ) == QtWidgets.QMessageBox.StandardButton.Yes if overwrite: QtCore.QFile.remove(os.path.join(destdir, item)) break diff --git a/src/bitmessageqt/address_dialogs.py b/src/bitmessageqt/address_dialogs.py index 937b7f8157..30af4d9e14 100644 --- a/src/bitmessageqt/address_dialogs.py +++ b/src/bitmessageqt/address_dialogs.py @@ -5,7 +5,7 @@ import hashlib -from PyQt6 import QtGui, QtWidgets +from PyQt6 import QtCore, QtGui, QtWidgets import queues import bitmessageqt.widgets as widgets diff --git a/src/bitmessageqt/bitmessageui.py b/src/bitmessageqt/bitmessageui.py index 1f21ff3472..268b4ae1b6 100644 --- a/src/bitmessageqt/bitmessageui.py +++ b/src/bitmessageqt/bitmessageui.py @@ -608,41 +608,22 @@ def retranslateUi(self, MainWindow): self.label_3.setText(_translate("MainWindow", "Subject:")) self.label_2.setText(_translate("MainWindow", "From:")) self.label.setText(_translate("MainWindow", "To:")) - self.textEditMessage.setHtml( - _translate("MainWindow", "\n" - "" - "\n" - "


")) - self.tabWidgetSend.setTabText( - self.tabWidgetSend.indexOf(self.sendDirect), - _translate("MainWindow", "Send ordinary Message")) + self.textEditMessage.setHtml(_translate("MainWindow", "\n" + "\n" + "


")) + self.tabWidgetSend.setTabText(self.tabWidgetSend.indexOf(self.sendDirect), + _translate("MainWindow", "Send ordinary Message")) self.label_8.setText(_translate("MainWindow", "From:")) self.label_7.setText(_translate("MainWindow", "Subject:")) - self.textEditMessageBroadcast.setHtml( - _translate("MainWindow", "\n" - "" - "\n" - "


")) - self.tabWidgetSend.setTabText( - self.tabWidgetSend.indexOf(self.sendBroadcast), - _translate("MainWindow", "Send Message to your Subscribers")) + self.textEditMessageBroadcast.setHtml(_translate("MainWindow", "\n" + "\n" + "


")) + self.tabWidgetSend.setTabText(self.tabWidgetSend.indexOf(self.sendBroadcast), + _translate("MainWindow", "Send Message to your Subscribers")) self.pushButtonTTL.setText(_translate("MainWindow", "TTL:")) self.pushButtonClear.setText(_translate("MainWindow", "Clear")) self.pushButtonSend.setText(_translate("MainWindow", "Send")) diff --git a/src/bitmessageqt/dialogs.py b/src/bitmessageqt/dialogs.py index a7c0d94290..401b8f08e7 100644 --- a/src/bitmessageqt/dialogs.py +++ b/src/bitmessageqt/dialogs.py @@ -2,7 +2,7 @@ Custom dialog classes """ # pylint: disable=too-few-public-methods -from PyQt6 import QtWidgets +from PyQt6 import QtGui, QtWidgets import paths import bitmessageqt.widgets as widgets diff --git a/src/bitmessageqt/languagebox.py b/src/bitmessageqt/languagebox.py index 0277353455..00ead98ae8 100644 --- a/src/bitmessageqt/languagebox.py +++ b/src/bitmessageqt/languagebox.py @@ -3,7 +3,7 @@ import glob import os -from PyQt6 import QtCore, QtWidgets +from PyQt6 import QtCore, QtGui, QtWidgets import paths from bmconfigparser import config diff --git a/src/bitmessageqt/messageview.py b/src/bitmessageqt/messageview.py index c77cc55d8f..8c8b09ad6a 100644 --- a/src/bitmessageqt/messageview.py +++ b/src/bitmessageqt/messageview.py @@ -38,9 +38,7 @@ def resizeEvent(self, event): def mousePressEvent(self, event): """Mouse press button event handler""" - b = event.button() - lb = QtCore.Qt.MouseButton.LeftButton - if b == lb and self.html and self.html.has_html and self.cursorForPosition( + if event.button() == QtCore.Qt.MouseButton.LeftButton and self.html and self.html.has_html and self.cursorForPosition( event.pos()).block().blockNumber() == 0: if self.mode == MessageView.MODE_PLAIN: self.showHTML() diff --git a/src/bitmessageqt/migrationwizard.py b/src/bitmessageqt/migrationwizard.py index 4187ae85c1..d6539d5a11 100644 --- a/src/bitmessageqt/migrationwizard.py +++ b/src/bitmessageqt/migrationwizard.py @@ -1,5 +1,5 @@ #!/usr/bin/env python2.7 -from PyQt6 import QtGui, QtWidgets +from PyQt6 import QtCore, QtGui, QtWidgets class MigrationWizardIntroPage(QtWidgets.QWizardPage): @@ -8,8 +8,7 @@ def __init__(self): self.setTitle("Migrating configuration") label = QtGui.QLabel("This wizard will help you to migrate your configuration. " - "You can still keep using PyBitMessage" - " once you migrate, the changes are backwards compatible.") + "You can still keep using PyBitMessage once you migrate, the changes are backwards compatible.") label.setWordWrap(True) layout = QtGui.QVBoxLayout() diff --git a/src/bitmessageqt/newchandialog.py b/src/bitmessageqt/newchandialog.py index 224bdc20c3..0dd7784a8f 100644 --- a/src/bitmessageqt/newchandialog.py +++ b/src/bitmessageqt/newchandialog.py @@ -4,12 +4,11 @@ """ -from PyQt6 import QtCore, QtWidgets +from PyQt6 import QtCore, QtGui, QtWidgets import bitmessageqt.widgets as widgets from addresses import addBMIfNotPresent -# XXX unresolved -# from .addressvalidator import AddressValidator, PassPhraseValidator +from .addressvalidator import AddressValidator, PassPhraseValidator from queues import ( addressGeneratorQueue, apiAddressGeneratorReturnQueue, UISignalQueue) from tr import _translate diff --git a/src/bitmessageqt/retranslateui.py b/src/bitmessageqt/retranslateui.py index a382545f38..e987378b66 100644 --- a/src/bitmessageqt/retranslateui.py +++ b/src/bitmessageqt/retranslateui.py @@ -1,4 +1,6 @@ -from PyQt6 import QtWidgets +from os import path +from PyQt6 import QtGui, QtWidgets +from debug import logger import bitmessageqt.widgets as widgets diff --git a/src/bitmessageqt/settingsmixin.py b/src/bitmessageqt/settingsmixin.py index 3cc8dc389e..0e2d319bad 100644 --- a/src/bitmessageqt/settingsmixin.py +++ b/src/bitmessageqt/settingsmixin.py @@ -5,7 +5,7 @@ """ -from PyQt6 import QtCore, QtWidgets +from PyQt6 import QtCore, QtGui, QtWidgets class SettingsMixin(object): diff --git a/src/bitmessageqt/statusbar.py b/src/bitmessageqt/statusbar.py index a3f4bf7997..a7162cc9aa 100644 --- a/src/bitmessageqt/statusbar.py +++ b/src/bitmessageqt/statusbar.py @@ -2,7 +2,7 @@ """Status bar Module""" from time import time -from PyQt6 import QtWidgets +from PyQt6 import QtGui, QtWidgets class BMStatusBar(QtWidgets.QStatusBar): diff --git a/src/bitmessageqt/widgets.py b/src/bitmessageqt/widgets.py index 223c498b4b..1ed2533a97 100644 --- a/src/bitmessageqt/widgets.py +++ b/src/bitmessageqt/widgets.py @@ -1,6 +1,7 @@ from PyQt6 import uic import os.path import paths +import sys def resource_path(resFile): From 1e53720b54e3aec3ed54001fd92cfb1bdfa2b24f Mon Sep 17 00:00:00 2001 From: Kashiko Koibumi Date: Fri, 17 May 2024 11:51:07 +0900 Subject: [PATCH 21/32] Revert "run autopep8 on src/bitmessageqt" This reverts commit ab9fc0b390fbd67540df5c58f1b40ac80095ca37. --- run-autopep8.sh | 2 +- src/bitmessageqt/__init__.py | 99 ++++++++++++------------- src/bitmessageqt/address_dialogs.py | 2 - src/bitmessageqt/addressvalidator.py | 3 - src/bitmessageqt/bitmessage_icons_rc.py | 3 - src/bitmessageqt/bitmessageui.py | 62 ++++++---------- src/bitmessageqt/blacklist.py | 8 +- src/bitmessageqt/dialogs.py | 4 - src/bitmessageqt/foldertree.py | 7 -- src/bitmessageqt/messagecompose.py | 1 - src/bitmessageqt/messageview.py | 5 +- src/bitmessageqt/migrationwizard.py | 17 ++--- src/bitmessageqt/networkstatus.py | 1 - src/bitmessageqt/newchandialog.py | 5 +- src/bitmessageqt/retranslateui.py | 5 +- src/bitmessageqt/settings.py | 1 - src/bitmessageqt/settingsmixin.py | 5 -- src/bitmessageqt/utils.py | 2 +- src/bitmessageqt/widgets.py | 2 - 19 files changed, 92 insertions(+), 142 deletions(-) diff --git a/run-autopep8.sh b/run-autopep8.sh index 701a6c0d70..e879318fc8 100755 --- a/run-autopep8.sh +++ b/run-autopep8.sh @@ -1,2 +1,2 @@ #!/bin/sh -autopep8 --in-place --recursive src src/bitmessageqt +autopep8 --in-place --recursive src diff --git a/src/bitmessageqt/__init__.py b/src/bitmessageqt/__init__.py index dd922a25dc..aaf2f24319 100644 --- a/src/bitmessageqt/__init__.py +++ b/src/bitmessageqt/__init__.py @@ -53,7 +53,7 @@ from .statusbar import BMStatusBar import bitmessageqt.sound as sound # This is needed for tray icon -import bitmessageqt.bitmessage_icons_rc as bitmessage_icons_rc # noqa:F401 pylint: disable=unused-import +import bitmessageqt.bitmessage_icons_rc as bitmessage_icons_rc # noqa:F401 pylint: disable=unused-import import helper_sent try: @@ -152,9 +152,8 @@ def init_file_menu(self): self.ui.actionNetworkSwitch.triggered.connect(self.network_switch) self.ui.actionManageKeys.triggered.connect(self.click_actionManageKeys) self.ui.actionDeleteAllTrashedMessages.triggered.connect(self.click_actionDeleteAllTrashedMessages) - self.ui.actionRegenerateDeterministicAddresses.triggered.connect( - self.click_actionRegenerateDeterministicAddresses) - self.ui.pushButtonAddChan.clicked.connect(self.click_actionJoinChan) # also used for creating chans. + self.ui.actionRegenerateDeterministicAddresses.triggered.connect(self.click_actionRegenerateDeterministicAddresses) + self.ui.pushButtonAddChan.clicked.connect(self.click_actionJoinChan) # also used for creating chans. self.ui.pushButtonNewAddress.clicked.connect(self.click_NewAddressDialog) self.ui.pushButtonAddAddressBook.clicked.connect(self.click_pushButtonAddAddressBook) self.ui.pushButtonAddSubscription.clicked.connect(self.click_pushButtonAddSubscription) @@ -753,11 +752,11 @@ def __init__(self, parent=None): # Put the TTL slider in the correct spot TTL = config.getint('bitmessagesettings', 'ttl') - if TTL < 3600: # an hour + if TTL < 3600: # an hour TTL = 3600 - elif TTL > 28 * 24 * 60 * 60: # 28 days - TTL = 28 * 24 * 60 * 60 - self.ui.horizontalSliderTTL.setSliderPosition(int((TTL - 3600) ** (1 / 3.199))) + elif TTL > 28*24*60*60: # 28 days + TTL = 28*24*60*60 + self.ui.horizontalSliderTTL.setSliderPosition(int((TTL - 3600) ** (1/3.199))) self.updateHumanFriendlyTTLDescription(TTL) self.ui.horizontalSliderTTL.valueChanged.connect(self.updateTTL) @@ -816,20 +815,20 @@ def updateTTL(self, sliderPosition): config.save() def updateHumanFriendlyTTLDescription(self, TTL): - numberOfHours = int(round(TTL / (60 * 60))) + numberOfHours = int(round(TTL / (60*60))) font = QtGui.QFont() stylesheet = "" if numberOfHours < 48: self.ui.labelHumanFriendlyTTLDescription.setText( - _translate("MainWindow", "%n hour(s)", None, numberOfHours) - + ", " - + _translate("MainWindow", "not recommended for chans", None) - ) + _translate("MainWindow", "%n hour(s)", None, numberOfHours) + + ", " + + _translate("MainWindow", "not recommended for chans", None) + ) stylesheet = "QLabel { color : red; }" font.setBold(True) else: - numberOfDays = int(round(TTL / (24 * 60 * 60))) + numberOfDays = int(round(TTL / (24*60*60))) self.ui.labelHumanFriendlyTTLDescription.setText( _translate( "MainWindow", @@ -1105,7 +1104,7 @@ def addMessageListItemSent( else: statusText = _translate( "MainWindow", "Unknown status: {0} {1}").format(status, - l10n.formatTimestamp(lastactiontime)) + l10n.formatTimestamp(lastactiontime)) items = [ MessageList_AddressWidget( @@ -1222,7 +1221,7 @@ def loadMessagelist( # create application indicator def appIndicatorInit(self, app): self.initTrayIcon("can-icon-24px-red.png", app) - self.tray.activated.connect(self.__icon_activated) + self.tray.activated.connect(self.__icon_activated); m = QtWidgets.QMenu() @@ -1393,7 +1392,7 @@ def _simple_notify( self._notifier = _simple_notify # does nothing if isAvailable returns false # XXX unresolved - # self._player = QtGui.QSound.play + #self._player = QtGui.QSound.play if not get_plugins: return @@ -1407,7 +1406,7 @@ def _simple_notify( self._theme_player = get_plugin('notification.sound', 'theme') # XXX unresolved - # if not QtGui.QSound.isAvailable(): + #if not QtGui.QSound.isAvailable(): if not False: _plugin = get_plugin( 'notification.sound', 'file', fallback='file.fallback') @@ -1780,7 +1779,7 @@ def calcTrayIcon(self, iconFileName, inboxUnreadCount): pen.setBrush(QtGui.QBrush(QtCore.Qt.BrushStyle.SolidPattern)) painter.setPen(pen) painter.setFont(font) - painter.drawText(24 - rect.right() - marginX, -rect.top() + marginY, txt) + painter.drawText(24-rect.right()-marginX, -rect.top()+marginY, txt) painter.end() return QtGui.QIcon(pixmap) @@ -1857,7 +1856,7 @@ def updateSentItemStatusByAckdata(self, ackdata, textToDisplay): try: newlinePosition = textToDisplay.indexOf('\n') except: - # If someone misses adding a "_translate" to a string before passing it to this function, + # If someone misses adding a "_translate" to a string before passing it to this function, # this function won't receive a qstring which will cause an exception. newlinePosition = 0 if newlinePosition > 1: @@ -1894,7 +1893,7 @@ def newVersionAvailable(self, version): "MainWindow", "New version of PyBitmessage is available: {0}. Download it" " from https://github.com/Bitmessage/PyBitmessage/releases/latest" - ).format(self.notifiedNewVersion) + ).format(self.notifiedNewVersion) ) def displayAlert(self, title, text, exitAfterUserClicksOk): @@ -1918,7 +1917,7 @@ def rerenderMessagelistToLabels(self): messagelist.item(i, 0).setLabel() def rerenderAddressBook(self): - def addRow(address, label, type): + def addRow (address, label, type): self.ui.tableWidgetAddressBook.insertRow(0) newItem = Ui_AddressBookWidgetItemLabel(address, label, type) self.ui.tableWidgetAddressBook.setItem(0, 0, newItem) @@ -2066,14 +2065,14 @@ def click_pushButtonSend(self): "MainWindow", "You are trying to send an email instead of a bitmessage. " "This requires registering with a gateway. Attempt to register?"), - QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No) != QtWidgets.QMessageBox.StandardButton.Yes: + QtWidgets.QMessageBox.StandardButton.Yes|QtWidgets.QMessageBox.StandardButton.No) != QtWidgets.QMessageBox.StandardButton.Yes: continue email = acct.getLabel() - if email[-14:] != "@mailchuck.com": # attempt register + if email[-14:] != "@mailchuck.com": # attempt register # 12 character random email address email = ''.join( random.SystemRandom().choice(string.ascii_lowercase) for _ in range(12) - ) + "@mailchuck.com" + ) + "@mailchuck.com" acct = MailchuckAccount(fromAddress) acct.register(email) config.set(fromAddress, 'label', email) @@ -2085,7 +2084,7 @@ def click_pushButtonSend(self): " an email gateway. Sending registration" " now as {0}, please wait for the registration" " to be processed before retrying sending." - ).format(email) + ).format(email) ) return status, addressVersionNumber, streamNumber = decodeAddress(toAddress)[:3] @@ -2101,19 +2100,19 @@ def click_pushButtonSend(self): "MainWindow", "Error: Bitmessage addresses start with" " BM- Please check the recipient address {0}" - ).format(toAddress)) + ).format(toAddress)) elif status == 'checksumfailed': self.updateStatusBar(_translate( "MainWindow", "Error: The recipient address {0} is not" " typed or copied correctly. Please check it." - ).format(toAddress)) + ).format(toAddress)) elif status == 'invalidcharacters': self.updateStatusBar(_translate( "MainWindow", "Error: The recipient address {0} contains" " invalid characters. Please check it." - ).format(toAddress)) + ).format(toAddress)) elif status == 'versiontoohigh': self.updateStatusBar(_translate( "MainWindow", @@ -2121,7 +2120,7 @@ def click_pushButtonSend(self): " {0} is too high. Either you need to upgrade" " your Bitmessage software or your" " acquaintance is being clever." - ).format(toAddress)) + ).format(toAddress)) elif status == 'ripetooshort': self.updateStatusBar(_translate( "MainWindow", @@ -2129,7 +2128,7 @@ def click_pushButtonSend(self): " address {0} is too short. There might be" " something wrong with the software of" " your acquaintance." - ).format(toAddress)) + ).format(toAddress)) elif status == 'ripetoolong': self.updateStatusBar(_translate( "MainWindow", @@ -2137,7 +2136,7 @@ def click_pushButtonSend(self): " address {0} is too long. There might be" " something wrong with the software of" " your acquaintance." - ).format(toAddress)) + ).format(toAddress)) elif status == 'varintmalformed': self.updateStatusBar(_translate( "MainWindow", @@ -2145,13 +2144,13 @@ def click_pushButtonSend(self): " address {0} is malformed. There might be" " something wrong with the software of" " your acquaintance." - ).format(toAddress)) + ).format(toAddress)) else: self.updateStatusBar(_translate( "MainWindow", "Error: Something is wrong with the" " recipient address {0}." - ).format(toAddress)) + ).format(toAddress)) elif fromAddress == '': self.updateStatusBar(_translate( "MainWindow", @@ -2307,7 +2306,7 @@ def rerenderComboBoxSendFrom(self): i, AccountColor(address).accountColor(), QtCore.Qt.ItemDataRole.ForegroundRole) self.ui.comboBoxSendFrom.insertItem(0, '', '') - if (self.ui.comboBoxSendFrom.count() == 2): + if(self.ui.comboBoxSendFrom.count() == 2): self.ui.comboBoxSendFrom.setCurrentIndex(1) else: self.ui.comboBoxSendFrom.setCurrentIndex(0) @@ -2330,7 +2329,7 @@ def rerenderComboBoxSendFromBroadcast(self): i, AccountColor(address).accountColor(), QtCore.Qt.ItemDataRole.ForegroundRole) self.ui.comboBoxSendFromBroadcast.insertItem(0, '', '') - if (self.ui.comboBoxSendFromBroadcast.count() == 2): + if(self.ui.comboBoxSendFromBroadcast.count() == 2): self.ui.comboBoxSendFromBroadcast.setCurrentIndex(1) else: self.ui.comboBoxSendFromBroadcast.setCurrentIndex(0) @@ -2660,13 +2659,13 @@ def quit(self): "MainWindow", "%n object(s) pending proof of work", None, powQueueSize() - ) + ", " - + _translate( + ) + ", " + + _translate( "MainWindow", "%n object(s) waiting to be distributed", None, pendingUpload() - ) + "\n\n" - + _translate( + ) + "\n\n" + + _translate( "MainWindow", "Wait until these tasks finish?"), QtWidgets.QMessageBox.StandardButton.Yes | QtWidgets.QMessageBox.StandardButton.No | QtWidgets.QMessageBox.StandardButton.Cancel, QtWidgets.QMessageBox.StandardButton.Cancel) @@ -2749,8 +2748,8 @@ def quit(self): if curWorkerQueue > 0: self.updateStatusBar(_translate( "MainWindow", "Waiting for PoW to finish... {0}%" - ).format(50 * (maxWorkerQueue - curWorkerQueue) - / maxWorkerQueue)) + ).format(50 * (maxWorkerQueue - curWorkerQueue) / + maxWorkerQueue)) time.sleep(0.5) QtCore.QCoreApplication.processEvents( QtCore.QEventLoop.ProcessEventsFlag.AllEvents, 1000 @@ -2856,10 +2855,10 @@ def on_action_InboxMessageForceHtml(self): lines[i]) elif lines[i] == '------------------------------------------------------': lines[i] = '
' - elif lines[i] == '' and (i + 1) < totalLines and \ - lines[i + 1] != '------------------------------------------------------': + elif lines[i] == '' and (i+1) < totalLines and \ + lines[i+1] != '------------------------------------------------------': lines[i] = '

' - content = ' '.join(lines) # To keep the whitespace between lines + content = ' '.join(lines) # To keep the whitespace between lines content = shared.fixPotentiallyInvalidUTF8Data(content) content = content textEdit.setHtml(content) @@ -3018,8 +3017,8 @@ def on_action_InboxReply(self, reply_type=None): toAddressAtCurrentInboxRow = fromAddressAtCurrentInboxRow if fromAddressAtCurrentInboxRow == \ tableWidget.item(currentInboxRow, column_from).label or ( - isinstance(acct, GatewayAccount) - and fromAddressAtCurrentInboxRow == acct.relayAddress): + isinstance(acct, GatewayAccount) and + fromAddressAtCurrentInboxRow == acct.relayAddress): self.ui.lineEditTo.setText(str(acct.fromAddress)) else: self.ui.lineEditTo.setText( @@ -3205,7 +3204,7 @@ def on_action_InboxSaveMessageAs(self): defaultFilename = "".join(x for x in subjectAtCurrentInboxRow if x.isalnum()) + '.txt' filename = QtWidgets.QFileDialog.getSaveFileName( self, - _translate("MainWindow", "Save As..."), + _translate("MainWindow","Save As..."), defaultFilename, "Text files (*.txt);;All files (*.*)") if filename == '': @@ -3663,8 +3662,8 @@ def on_action_ClipboardMessagelist(self): otherAddress = tableWidget.item(currentRow, 1).data(QtCore.Qt.ItemDataRole.UserRole) account = accountClass(myAddress) if isinstance(account, GatewayAccount) and otherAddress == account.relayAddress and ( - (currentColumn in [0, 2] and self.getCurrentFolder() == "sent") - or (currentColumn in [1, 2] and self.getCurrentFolder() != "sent")): + (currentColumn in [0, 2] and self.getCurrentFolder() == "sent") or + (currentColumn in [1, 2] and self.getCurrentFolder() != "sent")): text = str(tableWidget.item(currentRow, currentColumn).label) else: text = tableWidget.item(currentRow, currentColumn).data(QtCore.Qt.ItemDataRole.UserRole) diff --git a/src/bitmessageqt/address_dialogs.py b/src/bitmessageqt/address_dialogs.py index 30af4d9e14..29bfc50a54 100644 --- a/src/bitmessageqt/address_dialogs.py +++ b/src/bitmessageqt/address_dialogs.py @@ -216,7 +216,6 @@ def _onSuccess(self, addressVersion, streamNumber, ripe): class RegenerateAddressesDialog(QtWidgets.QDialog): """QDialog for regenerating deterministic addresses""" - def __init__(self, parent=None): super(RegenerateAddressesDialog, self).__init__(parent) widgets.load('regenerateaddresses.ui', self) @@ -289,7 +288,6 @@ def accept(self): class EmailGatewayDialog(QtWidgets.QDialog): """QDialog for email gateway control""" - def __init__(self, parent, config=global_config, account=None): super(EmailGatewayDialog, self).__init__(parent) widgets.load('emailgateway.ui', self) diff --git a/src/bitmessageqt/addressvalidator.py b/src/bitmessageqt/addressvalidator.py index f02faf0451..9785c3a2f8 100644 --- a/src/bitmessageqt/addressvalidator.py +++ b/src/bitmessageqt/addressvalidator.py @@ -16,7 +16,6 @@ class AddressPassPhraseValidatorMixin(object): """Bitmessage address or passphrase validator class for Qt UI""" - def setParams( self, passPhraseObject=None, @@ -170,7 +169,6 @@ def checkData(self): class AddressValidator(QtGui.QValidator, AddressPassPhraseValidatorMixin): """AddressValidator class for Qt UI""" - def __init__(self, parent=None, passPhraseObject=None, feedBackObject=None, buttonBox=None, addressMandatory=True): super(AddressValidator, self).__init__(parent) self.setParams(passPhraseObject, parent, feedBackObject, buttonBox, addressMandatory) @@ -178,7 +176,6 @@ def __init__(self, parent=None, passPhraseObject=None, feedBackObject=None, butt class PassPhraseValidator(QtGui.QValidator, AddressPassPhraseValidatorMixin): """PassPhraseValidator class for Qt UI""" - def __init__(self, parent=None, addressObject=None, feedBackObject=None, buttonBox=None, addressMandatory=False): super(PassPhraseValidator, self).__init__(parent) self.setParams(parent, addressObject, feedBackObject, buttonBox, addressMandatory) diff --git a/src/bitmessageqt/bitmessage_icons_rc.py b/src/bitmessageqt/bitmessage_icons_rc.py index 549b3e611b..a06fd964f3 100644 --- a/src/bitmessageqt/bitmessage_icons_rc.py +++ b/src/bitmessageqt/bitmessage_icons_rc.py @@ -1666,13 +1666,10 @@ \x00\x00\x01\xe6\x00\x00\x00\x00\x00\x01\x00\x00\x34\xdf\ " - def qInitResources(): QtCore.qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data) - def qCleanupResources(): QtCore.qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data) - qInitResources() diff --git a/src/bitmessageqt/bitmessageui.py b/src/bitmessageqt/bitmessageui.py index 268b4ae1b6..2d4ce3eea3 100644 --- a/src/bitmessageqt/bitmessageui.py +++ b/src/bitmessageqt/bitmessageui.py @@ -15,7 +15,6 @@ from .networkstatus import NetworkStatus from .blacklist import Blacklist - class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") @@ -23,8 +22,7 @@ def setupUi(self, MainWindow): self.MainDock = QtWidgets.QDockWidget(parent=MainWindow) self.MainDock.setGeometry(QtCore.QRect(0, 0, 885, 580)) icon = QtGui.QIcon() - icon.addPixmap(QtGui.QPixmap(":/newPrefix/images/can-icon-24px.png"), - QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + icon.addPixmap(QtGui.QPixmap(":/newPrefix/images/can-icon-24px.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) self.MainDock.setWindowIcon(icon) self.MainDock.setObjectName("MainDock") self.centralwidget = QtWidgets.QWidget() @@ -33,8 +31,7 @@ def setupUi(self, MainWindow): self.gridLayout_10.setObjectName("gridLayout_10") self.tabWidget = QtWidgets.QTabWidget(parent=self.centralwidget) self.tabWidget.setTabShape(QtWidgets.QTabWidget.TabShape.Rounded) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, - QtWidgets.QSizePolicy.Policy.Expanding) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.tabWidget.sizePolicy().hasHeightForWidth()) @@ -59,8 +56,7 @@ def setupUi(self, MainWindow): self.treeWidgetYourIdentities.setMaximumSize(QtCore.QSize(200, 16777215)) self.treeWidgetYourIdentities.setObjectName("treeWidgetYourIdentities") icon1 = QtGui.QIcon() - icon1.addPixmap(QtGui.QPixmap(":/newPrefix/images/identities.png"), - QtGui.QIcon.Mode.Selected, QtGui.QIcon.State.Off) + icon1.addPixmap(QtGui.QPixmap(":/newPrefix/images/identities.png"), QtGui.QIcon.Mode.Selected, QtGui.QIcon.State.Off) self.treeWidgetYourIdentities.headerItem().setIcon(0, icon1) self.verticalLayout_12.addWidget(self.treeWidgetYourIdentities) self.pushButtonNewAddress = QtWidgets.QPushButton(parent=self.inbox) @@ -139,8 +135,7 @@ def setupUi(self, MainWindow): self.tableWidgetAddressBook.setRowCount(0) item = QtWidgets.QTableWidgetItem() icon3 = QtGui.QIcon() - icon3.addPixmap(QtGui.QPixmap(":/newPrefix/images/addressbook.png"), - QtGui.QIcon.Mode.Selected, QtGui.QIcon.State.Off) + icon3.addPixmap(QtGui.QPixmap(":/newPrefix/images/addressbook.png"), QtGui.QIcon.Mode.Selected, QtGui.QIcon.State.Off) item.setIcon(icon3) self.tableWidgetAddressBook.setHorizontalHeaderItem(0, item) item = QtWidgets.QTableWidgetItem() @@ -316,8 +311,7 @@ def setupUi(self, MainWindow): self.treeWidgetSubscriptions.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows) self.treeWidgetSubscriptions.setObjectName("treeWidgetSubscriptions") icon5 = QtGui.QIcon() - icon5.addPixmap(QtGui.QPixmap(":/newPrefix/images/subscriptions.png"), - QtGui.QIcon.Mode.Selected, QtGui.QIcon.State.Off) + icon5.addPixmap(QtGui.QPixmap(":/newPrefix/images/subscriptions.png"), QtGui.QIcon.Mode.Selected, QtGui.QIcon.State.Off) self.treeWidgetSubscriptions.headerItem().setIcon(0, icon5) self.verticalLayout_3.addWidget(self.treeWidgetSubscriptions) self.pushButtonAddSubscription = QtWidgets.QPushButton(parent=self.subscriptions) @@ -344,10 +338,8 @@ def setupUi(self, MainWindow): self.tableWidgetInboxSubscriptions = QtWidgets.QTableWidget(parent=self.subscriptions) self.tableWidgetInboxSubscriptions.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers) self.tableWidgetInboxSubscriptions.setAlternatingRowColors(True) - self.tableWidgetInboxSubscriptions.setSelectionMode( - QtWidgets.QAbstractItemView.SelectionMode.ExtendedSelection) - self.tableWidgetInboxSubscriptions.setSelectionBehavior( - QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows) + self.tableWidgetInboxSubscriptions.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.ExtendedSelection) + self.tableWidgetInboxSubscriptions.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows) self.tableWidgetInboxSubscriptions.setWordWrap(False) self.tableWidgetInboxSubscriptions.setObjectName("tableWidgetInboxSubscriptions") self.tableWidgetInboxSubscriptions.setColumnCount(4) @@ -377,8 +369,7 @@ def setupUi(self, MainWindow): self.horizontalLayout_4.addLayout(self.verticalLayout_4) self.gridLayout_3.addLayout(self.horizontalLayout_4, 0, 0, 1, 1) icon6 = QtGui.QIcon() - icon6.addPixmap(QtGui.QPixmap(":/newPrefix/images/subscriptions.png"), - QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + icon6.addPixmap(QtGui.QPixmap(":/newPrefix/images/subscriptions.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) self.tabWidget.addTab(self.subscriptions, icon6, "") self.chans = QtWidgets.QWidget() self.chans.setObjectName("chans") @@ -397,8 +388,7 @@ def setupUi(self, MainWindow): self.treeWidgetChans.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows) self.treeWidgetChans.setObjectName("treeWidgetChans") icon7 = QtGui.QIcon() - icon7.addPixmap(QtGui.QPixmap(":/newPrefix/images/can-icon-16px.png"), - QtGui.QIcon.Mode.Selected, QtGui.QIcon.State.Off) + icon7.addPixmap(QtGui.QPixmap(":/newPrefix/images/can-icon-16px.png"), QtGui.QIcon.Mode.Selected, QtGui.QIcon.State.Off) self.treeWidgetChans.headerItem().setIcon(0, icon7) self.verticalLayout_17.addWidget(self.treeWidgetChans) self.pushButtonAddChan = QtWidgets.QPushButton(parent=self.chans) @@ -456,8 +446,7 @@ def setupUi(self, MainWindow): self.horizontalLayout_7.addLayout(self.verticalLayout_8) self.gridLayout_4.addLayout(self.horizontalLayout_7, 0, 0, 1, 1) icon8 = QtGui.QIcon() - icon8.addPixmap(QtGui.QPixmap(":/newPrefix/images/can-icon-16px.png"), - QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) + icon8.addPixmap(QtGui.QPixmap(":/newPrefix/images/can-icon-16px.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) self.tabWidget.addTab(self.chans, icon8, "") self.blackwhitelist = Blacklist() self.blackwhitelist.setObjectName("blackwhitelist") @@ -609,21 +598,19 @@ def retranslateUi(self, MainWindow): self.label_2.setText(_translate("MainWindow", "From:")) self.label.setText(_translate("MainWindow", "To:")) self.textEditMessage.setHtml(_translate("MainWindow", "\n" - "\n" - "


")) - self.tabWidgetSend.setTabText(self.tabWidgetSend.indexOf(self.sendDirect), - _translate("MainWindow", "Send ordinary Message")) +"\n" +"


")) + self.tabWidgetSend.setTabText(self.tabWidgetSend.indexOf(self.sendDirect), _translate("MainWindow", "Send ordinary Message")) self.label_8.setText(_translate("MainWindow", "From:")) self.label_7.setText(_translate("MainWindow", "Subject:")) self.textEditMessageBroadcast.setHtml(_translate("MainWindow", "\n" - "\n" - "


")) - self.tabWidgetSend.setTabText(self.tabWidgetSend.indexOf(self.sendBroadcast), - _translate("MainWindow", "Send Message to your Subscribers")) +"\n" +"


")) + self.tabWidgetSend.setTabText(self.tabWidgetSend.indexOf(self.sendBroadcast), _translate("MainWindow", "Send Message to your Subscribers")) self.pushButtonTTL.setText(_translate("MainWindow", "TTL:")) self.pushButtonClear.setText(_translate("MainWindow", "Clear")) self.pushButtonSend.setText(_translate("MainWindow", "Send")) @@ -645,8 +632,7 @@ def retranslateUi(self, MainWindow): item.setText(_translate("MainWindow", "Subject")) item = self.tableWidgetInboxSubscriptions.horizontalHeaderItem(3) item.setText(_translate("MainWindow", "Received")) - self.tabWidget.setTabText(self.tabWidget.indexOf(self.subscriptions), - _translate("MainWindow", "Subscriptions")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.subscriptions), _translate("MainWindow", "Subscriptions")) self.treeWidgetChans.headerItem().setText(0, _translate("MainWindow", "Chans")) self.pushButtonAddChan.setText(_translate("MainWindow", "Add Chan")) self.inboxSearchLineEditChans.setPlaceholderText(_translate("MainWindow", "Search")) @@ -666,8 +652,7 @@ def retranslateUi(self, MainWindow): item.setText(_translate("MainWindow", "Received")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.chans), _translate("MainWindow", "Chans")) self.networkstatus.retranslateUi() - self.tabWidget.setTabText(self.tabWidget.indexOf(self.networkstatus), - _translate("MainWindow", "Network Status")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.networkstatus), _translate("MainWindow", "Network Status")) self.menuFile.setTitle(_translate("MainWindow", "File")) self.menuSettings.setTitle(_translate("MainWindow", "Settings")) self.menuHelp.setTitle(_translate("MainWindow", "Help")) @@ -680,8 +665,7 @@ def retranslateUi(self, MainWindow): self.actionSupport.setText(_translate("MainWindow", "Contact support")) self.actionAbout.setText(_translate("MainWindow", "About")) self.actionSettings.setText(_translate("MainWindow", "Settings")) - self.actionRegenerateDeterministicAddresses.setText( - _translate("MainWindow", "Regenerate deterministic addresses")) + self.actionRegenerateDeterministicAddresses.setText(_translate("MainWindow", "Regenerate deterministic addresses")) self.actionDeleteAllTrashedMessages.setText(_translate("MainWindow", "Delete all trashed messages")) self.actionJoinChan.setText(_translate("MainWindow", "Join / Create chan")) self.updateNetworkSwitchMenuLabel() diff --git a/src/bitmessageqt/blacklist.py b/src/bitmessageqt/blacklist.py index bcfb49c334..87520c9225 100644 --- a/src/bitmessageqt/blacklist.py +++ b/src/bitmessageqt/blacklist.py @@ -27,7 +27,7 @@ def __init__(self, parent=None): self.tableWidgetBlacklist.itemChanged.connect(self.tableWidgetBlacklistItemChanged) # Set the icon sizes for the identicons - identicon_size = 3 * 7 + identicon_size = 3*7 self.tableWidgetBlacklist.setIconSize(QtCore.QSize(identicon_size, identicon_size)) self.UISignalThread = UISignaler.get() @@ -64,7 +64,7 @@ def click_pushButtonAddBlacklist(self): sql = '''select * from blacklist where address=?''' else: sql = '''select * from whitelist where address=?''' - queryreturn = sqlQuery(sql, *t) + queryreturn = sqlQuery(sql,*t) if queryreturn == []: self.tableWidgetBlacklist.setSortingEnabled(False) self.tableWidgetBlacklist.insertRow(0) @@ -106,10 +106,10 @@ def tableWidgetBlacklistItemChanged(self, item): if isinstance(addressitem, QtWidgets.QTableWidgetItem): if self.radioButtonBlacklist.isChecked(): sqlExecute('''UPDATE blacklist SET label=? WHERE address=?''', - str(item.text()), str(addressitem.text())) + str(item.text()), str(addressitem.text())) else: sqlExecute('''UPDATE whitelist SET label=? WHERE address=?''', - str(item.text()), str(addressitem.text())) + str(item.text()), str(addressitem.text())) def init_blacklist_popup_menu(self, connectSignal=True): # Popup menu for the Blacklist page diff --git a/src/bitmessageqt/dialogs.py b/src/bitmessageqt/dialogs.py index 401b8f08e7..9cea3fd828 100644 --- a/src/bitmessageqt/dialogs.py +++ b/src/bitmessageqt/dialogs.py @@ -27,7 +27,6 @@ class AboutDialog(QtWidgets.QDialog): """The `About` dialog""" - def __init__(self, parent=None): super(AboutDialog, self).__init__(parent) widgets.load('about.ui', self) @@ -56,7 +55,6 @@ def __init__(self, parent=None): class IconGlossaryDialog(QtWidgets.QDialog): """The `Icon Glossary` dialog, explaining the status icon colors""" - def __init__(self, parent=None, config=None): super(IconGlossaryDialog, self).__init__(parent) widgets.load('iconglossary.ui', self) @@ -73,7 +71,6 @@ def __init__(self, parent=None, config=None): class HelpDialog(QtWidgets.QDialog): """The `Help` dialog""" - def __init__(self, parent=None): super(HelpDialog, self).__init__(parent) widgets.load('help.ui', self) @@ -82,7 +79,6 @@ def __init__(self, parent=None): class ConnectDialog(QtWidgets.QDialog): """The `Connect` dialog""" - def __init__(self, parent=None): super(ConnectDialog, self).__init__(parent) widgets.load('connect.ui', self) diff --git a/src/bitmessageqt/foldertree.py b/src/bitmessageqt/foldertree.py index b26d9861d1..896b355d53 100644 --- a/src/bitmessageqt/foldertree.py +++ b/src/bitmessageqt/foldertree.py @@ -219,7 +219,6 @@ def __lt__(self, other): class Ui_AddressWidget(BMTreeWidgetItem, SettingsMixin): """Item in the account/folder tree representing an account""" - def __init__(self, parent, pos=0, address=None, unreadCount=0, enabled=True): super(Ui_AddressWidget, self).__init__( parent, pos, address, unreadCount) @@ -298,7 +297,6 @@ def __lt__(self, other): class Ui_SubscriptionWidget(Ui_AddressWidget): """Special treating of subscription addresses""" # pylint: disable=unused-argument - def __init__(self, parent, pos=0, address="", unreadCount=0, label="", enabled=True): super(Ui_SubscriptionWidget, self).__init__( parent, pos, address, unreadCount, enabled) @@ -389,7 +387,6 @@ def data(self, role): class MessageList_AddressWidget(BMAddressWidget): """Address item in a messagelist""" - def __init__(self, address=None, label=None, unread=False): self.setAddress(address) super(MessageList_AddressWidget, self).__init__(label, unread) @@ -439,7 +436,6 @@ def __lt__(self, other): class MessageList_SubjectWidget(BMTableWidgetItem): """Message list subject item""" - def __init__(self, subject=None, label=None, unread=False): self.setSubject(subject) super(MessageList_SubjectWidget, self).__init__(label, unread) @@ -497,7 +493,6 @@ def data(self, role=QtCore.Qt.ItemDataRole.UserRole): class Ui_AddressBookWidgetItem(BMAddressWidget): """Addressbook item""" # pylint: disable=unused-argument - def __init__(self, label=None, acc_type=AccountMixin.NORMAL): self.type = acc_type super(Ui_AddressBookWidgetItem, self).__init__(label=label) @@ -540,7 +535,6 @@ def __lt__(self, other): class Ui_AddressBookWidgetItemLabel(Ui_AddressBookWidgetItem): """Addressbook label item""" - def __init__(self, address, label, acc_type): self.address = address super(Ui_AddressBookWidgetItemLabel, self).__init__(label, acc_type) @@ -553,7 +547,6 @@ def data(self, role): class Ui_AddressBookWidgetItemAddress(Ui_AddressBookWidgetItem): """Addressbook address item""" - def __init__(self, address, label, acc_type): self.address = address super(Ui_AddressBookWidgetItemAddress, self).__init__(address, acc_type) diff --git a/src/bitmessageqt/messagecompose.py b/src/bitmessageqt/messagecompose.py index 9b2cb357f5..65fbddb6cf 100644 --- a/src/bitmessageqt/messagecompose.py +++ b/src/bitmessageqt/messagecompose.py @@ -8,7 +8,6 @@ class MessageCompose(QtWidgets.QTextEdit): """Editor class with wheel zoom functionality""" - def __init__(self, parent=0): super(MessageCompose, self).__init__(parent) self.setAcceptRichText(False) diff --git a/src/bitmessageqt/messageview.py b/src/bitmessageqt/messageview.py index 8c8b09ad6a..350d0c7fe1 100644 --- a/src/bitmessageqt/messageview.py +++ b/src/bitmessageqt/messageview.py @@ -135,7 +135,7 @@ def showPlain(self): out = self.html.raw if self.html.has_html: out = "
" + QtWidgets.QApplication.translate( - "MessageView", "HTML detected, click here to display") + "

" + out + "MessageView", "HTML detected, click here to display") + "
" + out self.out = out self.outpos = 0 self.setHtml("") @@ -145,8 +145,7 @@ def showHTML(self): """Render message as HTML""" self.mode = MessageView.MODE_HTML out = self.html.sanitised - out = "
" + \ - QtWidgets.QApplication.translate("MessageView", "Click here to disable HTML") + "

" + out + out = "
" + QtWidgets.QApplication.translate("MessageView", "Click here to disable HTML") + "

" + out self.out = out self.outpos = 0 self.setHtml("") diff --git a/src/bitmessageqt/migrationwizard.py b/src/bitmessageqt/migrationwizard.py index d6539d5a11..d76661b57d 100644 --- a/src/bitmessageqt/migrationwizard.py +++ b/src/bitmessageqt/migrationwizard.py @@ -1,23 +1,22 @@ #!/usr/bin/env python2.7 from PyQt6 import QtCore, QtGui, QtWidgets - class MigrationWizardIntroPage(QtWidgets.QWizardPage): def __init__(self): super(QtGui.QWizardPage, self).__init__() self.setTitle("Migrating configuration") label = QtGui.QLabel("This wizard will help you to migrate your configuration. " - "You can still keep using PyBitMessage once you migrate, the changes are backwards compatible.") + "You can still keep using PyBitMessage once you migrate, the changes are backwards compatible.") label.setWordWrap(True) layout = QtGui.QVBoxLayout() layout.addWidget(label) self.setLayout(layout) - + def nextId(self): return 1 - + class MigrationWizardAddressesPage(QtWidgets.QWizardPage): def __init__(self, addresses): @@ -30,10 +29,10 @@ def __init__(self, addresses): layout = QtGui.QVBoxLayout() layout.addWidget(label) self.setLayout(layout) - + def nextId(self): return 10 - + class MigrationWizardGPUPage(QtWidgets.QWizardPage): def __init__(self): @@ -46,10 +45,10 @@ def __init__(self): layout = QtGui.QVBoxLayout() layout.addWidget(label) self.setLayout(layout) - + def nextId(self): return 10 - + class MigrationWizardConclusionPage(QtWidgets.QWizardPage): def __init__(self): @@ -69,7 +68,7 @@ def __init__(self, addresses): super(QtGui.QWizard, self).__init__() self.pages = {} - + page = MigrationWizardIntroPage() self.setPage(0, page) self.setStartId(0) diff --git a/src/bitmessageqt/networkstatus.py b/src/bitmessageqt/networkstatus.py index f8f493f1be..32cb346902 100644 --- a/src/bitmessageqt/networkstatus.py +++ b/src/bitmessageqt/networkstatus.py @@ -18,7 +18,6 @@ class NetworkStatus(QtWidgets.QWidget, RetranslateMixin): """Network status tab""" - def __init__(self, parent=None): super(NetworkStatus, self).__init__(parent) widgets.load('networkstatus.ui', self) diff --git a/src/bitmessageqt/newchandialog.py b/src/bitmessageqt/newchandialog.py index 0dd7784a8f..e244f0bd01 100644 --- a/src/bitmessageqt/newchandialog.py +++ b/src/bitmessageqt/newchandialog.py @@ -17,13 +17,12 @@ class NewChanDialog(QtWidgets.QDialog): """The `New Chan` dialog""" - def __init__(self, parent=None): super(NewChanDialog, self).__init__(parent) widgets.load('newchandialog.ui', self) self.parent = parent # XXX unresolved - # self.chanAddress.setValidator( + #self.chanAddress.setValidator( # AddressValidator( # self.chanAddress, # self.chanPassPhrase, @@ -31,7 +30,7 @@ def __init__(self, parent=None): # self.buttonBox, # False)) # XXX unresolved - # self.chanPassPhrase.setValidator( + #self.chanPassPhrase.setValidator( # PassPhraseValidator( # self.chanPassPhrase, # self.chanAddress, diff --git a/src/bitmessageqt/retranslateui.py b/src/bitmessageqt/retranslateui.py index e987378b66..17dee2c705 100644 --- a/src/bitmessageqt/retranslateui.py +++ b/src/bitmessageqt/retranslateui.py @@ -3,7 +3,6 @@ from debug import logger import bitmessageqt.widgets as widgets - class RetranslateMixin(object): def retranslateUi(self): defaults = QtWidgets.QWidget() @@ -13,9 +12,9 @@ def retranslateUi(self): if callable(setTextMethod): getattr(self, attr).setText(getattr(defaults, attr).text()) elif isinstance(value, QtWidgets.QTableWidget): - for i in range(value.columnCount()): + for i in range (value.columnCount()): getattr(self, attr).horizontalHeaderItem(i).setText( getattr(defaults, attr).horizontalHeaderItem(i).text()) - for i in range(value.rowCount()): + for i in range (value.rowCount()): getattr(self, attr).verticalHeaderItem(i).setText( getattr(defaults, attr).verticalHeaderItem(i).text()) diff --git a/src/bitmessageqt/settings.py b/src/bitmessageqt/settings.py index 155bd56980..161acf695e 100644 --- a/src/bitmessageqt/settings.py +++ b/src/bitmessageqt/settings.py @@ -41,7 +41,6 @@ def getSOCKSProxyType(config): class SettingsDialog(QtWidgets.QDialog): """The "Settings" dialog""" - def __init__(self, parent=None, firstrun=False): super(SettingsDialog, self).__init__(parent) widgets.load('settings.ui', self) diff --git a/src/bitmessageqt/settingsmixin.py b/src/bitmessageqt/settingsmixin.py index 0e2d319bad..fc78f79477 100644 --- a/src/bitmessageqt/settingsmixin.py +++ b/src/bitmessageqt/settingsmixin.py @@ -10,7 +10,6 @@ class SettingsMixin(object): """Mixin for adding geometry and state saving between restarts.""" - def warnIfNoObjectName(self): """ Handle objects which don't have a name. Currently it ignores them. Objects without a name can't have their @@ -59,7 +58,6 @@ def readState(self, target): class SMainWindow(QtWidgets.QMainWindow, SettingsMixin): """Main window with Settings functionality.""" - def loadSettings(self): """Load main window settings.""" self.readGeometry(self) @@ -74,7 +72,6 @@ def saveSettings(self): class STableWidget(QtWidgets.QTableWidget, SettingsMixin): """Table widget with Settings functionality""" # pylint: disable=too-many-ancestors - def loadSettings(self): """Load table settings.""" self.readState(self.horizontalHeader()) @@ -86,7 +83,6 @@ def saveSettings(self): class SSplitter(QtWidgets.QSplitter, SettingsMixin): """Splitter with Settings functionality.""" - def loadSettings(self): """Load splitter settings""" self.readState(self) @@ -99,7 +95,6 @@ def saveSettings(self): class STreeWidget(QtWidgets.QTreeWidget, SettingsMixin): """Tree widget with settings functionality.""" # pylint: disable=too-many-ancestors - def loadSettings(self): """Load tree settings.""" # recurse children diff --git a/src/bitmessageqt/utils.py b/src/bitmessageqt/utils.py index e6c2b66c01..4a5b5ee637 100644 --- a/src/bitmessageqt/utils.py +++ b/src/bitmessageqt/utils.py @@ -89,7 +89,7 @@ def avatarize(address): # QImageReader.supportedImageFormats () extensions = [ 'PNG', 'GIF', 'JPG', 'JPEG', 'SVG', 'BMP', 'PBM', 'PGM', 'PPM', - 'XBM', 'XPM'] + 'XBM', 'XPM' ] # try to find a specific avatar for ext in extensions: lower_hash = state.appdata + 'avatars/' + icon_hash + '.' + ext.lower() diff --git a/src/bitmessageqt/widgets.py b/src/bitmessageqt/widgets.py index 1ed2533a97..6e9730a005 100644 --- a/src/bitmessageqt/widgets.py +++ b/src/bitmessageqt/widgets.py @@ -3,13 +3,11 @@ import paths import sys - def resource_path(resFile): baseDir = paths.codePath() for subDir in ["ui", "bitmessageqt"]: if os.path.isdir(os.path.join(baseDir, subDir)) and os.path.isfile(os.path.join(baseDir, subDir, resFile)): return os.path.join(baseDir, subDir, resFile) - def load(resFile, widget): uic.loadUi(resource_path(resFile), widget) From a02ef7060719ac3dc20e70cb2473a6c789fd0ff8 Mon Sep 17 00:00:00 2001 From: Kashiko Koibumi Date: Fri, 17 May 2024 11:51:12 +0900 Subject: [PATCH 22/32] Revert "fix complains from flake8" This reverts commit 60af4109abe76f0900202f634622a942abb38bb0. --- src/helper_msgcoding.py | 1 + src/network/asyncore_pollchoose.py | 1 + src/randomtrackingdict.py | 1 + src/storage/sqlite.py | 1 + src/tr.py | 2 +- 5 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/helper_msgcoding.py b/src/helper_msgcoding.py index 401b0e2030..9c2652d6dc 100644 --- a/src/helper_msgcoding.py +++ b/src/helper_msgcoding.py @@ -2,6 +2,7 @@ Message encoding end decoding functions """ +import string import zlib import messagetypes diff --git a/src/network/asyncore_pollchoose.py b/src/network/asyncore_pollchoose.py index 081efcf26d..c8b9e3647d 100644 --- a/src/network/asyncore_pollchoose.py +++ b/src/network/asyncore_pollchoose.py @@ -11,6 +11,7 @@ import socket import sys import time +import warnings from errno import ( EADDRINUSE, EAGAIN, EALREADY, EBADF, ECONNABORTED, ECONNREFUSED, ECONNRESET, EHOSTUNREACH, EINPROGRESS, EINTR, EINVAL, EISCONN, ENETUNREACH, diff --git a/src/randomtrackingdict.py b/src/randomtrackingdict.py index 0944da2a8a..1435180a77 100644 --- a/src/randomtrackingdict.py +++ b/src/randomtrackingdict.py @@ -3,6 +3,7 @@ """ from threading import RLock from time import time +from binascii import hexlify try: import helper_random diff --git a/src/storage/sqlite.py b/src/storage/sqlite.py index 4dae1ac3ac..38d9fd95fe 100644 --- a/src/storage/sqlite.py +++ b/src/storage/sqlite.py @@ -1,6 +1,7 @@ """ Sqlite Inventory """ +import sqlite3 import time from threading import RLock diff --git a/src/tr.py b/src/tr.py index a0cbf1a082..f26dcdffc7 100644 --- a/src/tr.py +++ b/src/tr.py @@ -42,7 +42,7 @@ def translateText(context, text, n=None): enableGUI = True if enableGUI: try: - from PyQt6 import QtWidgets + from PyQt6 import QtCore, QtGui, QtWidgets except Exception as err: print('PyBitmessage requires PyQt unless you want to run it as a daemon' ' and interact with it using the API.' From 97c9b7eaf615352d97f4acccced32f773b4bb810 Mon Sep 17 00:00:00 2001 From: Kashiko Koibumi Date: Fri, 17 May 2024 11:51:14 +0900 Subject: [PATCH 23/32] Revert "run autopep8 on src" This reverts commit 24b83aae2aed88ade5a95729ee786b7f3ef71b9a. --- run-autopep8.sh | 2 -- src/api.py | 1 - src/backend/address_generator.py | 1 - src/bitmessagemain.py | 43 +++++++++++++++--------------- src/bmconfigparser.py | 2 +- src/class_objectProcessor.py | 1 - src/class_singleWorker.py | 8 +++--- src/class_smtpServer.py | 3 --- src/depends.py | 2 +- src/helper_msgcoding.py | 3 --- src/inventory.py | 1 - src/messagetypes/message.py | 1 - src/network/__init__.py | 2 +- src/network/asyncore_pollchoose.py | 6 ++--- src/network/dandelion.py | 1 - src/network/httpd.py | 1 - src/network/objectracker.py | 2 +- src/network/receivequeuethread.py | 1 - src/network/socks4a.py | 3 --- src/network/socks5.py | 3 --- src/network/tls.py | 2 -- src/pyelliptic/cipher.py | 1 - src/pyelliptic/openssl.py | 1 - src/qidenticon.py | 1 - src/singleinstance.py | 1 - src/storage/sqlite.py | 1 - src/tr.py | 1 - 27 files changed, 32 insertions(+), 63 deletions(-) delete mode 100755 run-autopep8.sh diff --git a/run-autopep8.sh b/run-autopep8.sh deleted file mode 100755 index e879318fc8..0000000000 --- a/run-autopep8.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -autopep8 --in-place --recursive src diff --git a/src/api.py b/src/api.py index be2a64dd80..a444556951 100644 --- a/src/api.py +++ b/src/api.py @@ -328,7 +328,6 @@ def __call__(self, func): class command(object): # pylint: disable=too-few-public-methods """Decorator for API command method""" - def __init__(self, *aliases): self.aliases = aliases diff --git a/src/backend/address_generator.py b/src/backend/address_generator.py index f5455a428e..312c313bc2 100644 --- a/src/backend/address_generator.py +++ b/src/backend/address_generator.py @@ -12,7 +12,6 @@ class AddressGenerator(object): """"Base class for address generation and validation""" - def __init__(self): pass diff --git a/src/bitmessagemain.py b/src/bitmessagemain.py index 4d8ea61d54..f51ee06315 100755 --- a/src/bitmessagemain.py +++ b/src/bitmessagemain.py @@ -9,27 +9,6 @@ # Right now, PyBitmessage only support connecting to stream 1. It doesn't # yet contain logic to expand into further streams. -from threads import ( - set_thread_name, printLock, - addressGenerator, objectProcessor, singleCleaner, singleWorker, sqlThread) -from singleinstance import singleinstance -from inventory import Inventory -from helper_startup import ( - adjustHalfOpenConnectionsLimit, fixSocket, start_proxyconfig) -from debug import logger # this should go before any threads -from bmconfigparser import config -from testmode_init import populate_api_test_data -import state -import shutdown -import network -import defaults -import traceback -import time -import threading -import signal -import multiprocessing -import getopt -import depends import os import sys @@ -39,13 +18,34 @@ from pybitmessage import pathmagic app_dir = pathmagic.setup() +import depends depends.check_dependencies() +import getopt +import multiprocessing # Used to capture a Ctrl-C keypress so that Bitmessage can shutdown gracefully. +import signal +import threading +import time +import traceback +import defaults # Network subsystem +import network +import shutdown +import state +from testmode_init import populate_api_test_data +from bmconfigparser import config +from debug import logger # this should go before any threads +from helper_startup import ( + adjustHalfOpenConnectionsLimit, fixSocket, start_proxyconfig) +from inventory import Inventory +from singleinstance import singleinstance # Synchronous threads +from threads import ( + set_thread_name, printLock, + addressGenerator, objectProcessor, singleCleaner, singleWorker, sqlThread) def signal_handler(signum, frame): @@ -81,7 +81,6 @@ def signal_handler(signum, frame): class Main(object): """Main PyBitmessage class""" - def start(self): """Start main application""" # pylint: disable=too-many-statements,too-many-branches,too-many-locals diff --git a/src/bmconfigparser.py b/src/bmconfigparser.py index 1062e63048..abf285ad07 100644 --- a/src/bmconfigparser.py +++ b/src/bmconfigparser.py @@ -128,7 +128,7 @@ def save(self): shutil.copyfile(fileName, fileNameBak) # The backup succeeded. fileNameExisted = True - except (IOError, Exception): + except(IOError, Exception): # The backup failed. This can happen if the file # didn't exist before. fileNameExisted = False diff --git a/src/class_objectProcessor.py b/src/class_objectProcessor.py index 394601bedc..1a71f929d6 100644 --- a/src/class_objectProcessor.py +++ b/src/class_objectProcessor.py @@ -43,7 +43,6 @@ class objectProcessor(threading.Thread): The objectProcessor thread, of which there is only one, receives network objects (msg, broadcast, pubkey, getpubkey) from the receiveDataThreads. """ - def __init__(self): threading.Thread.__init__(self, name="objectProcessor") random.seed() diff --git a/src/class_singleWorker.py b/src/class_singleWorker.py index 8392e8d11c..7a41f3c1b4 100644 --- a/src/class_singleWorker.py +++ b/src/class_singleWorker.py @@ -1080,10 +1080,10 @@ def sendMsg(self): " more difficult than you are" " willing to do. {2}" ).format(str(float(requiredAverageProofOfWorkNonceTrialsPerByte) - / defaults.networkDefaultProofOfWorkNonceTrialsPerByte), - str(float(requiredPayloadLengthExtraBytes) - / defaults.networkDefaultPayloadLengthExtraBytes), - l10n.formatTimestamp())))) + / defaults.networkDefaultProofOfWorkNonceTrialsPerByte), + str(float(requiredPayloadLengthExtraBytes) + / defaults.networkDefaultPayloadLengthExtraBytes), + l10n.formatTimestamp())))) continue else: # if we are sending a message to ourselves or a chan.. self.logger.info('Sending a message.') diff --git a/src/class_smtpServer.py b/src/class_smtpServer.py index e925bf3fdb..44ea7c9cc4 100644 --- a/src/class_smtpServer.py +++ b/src/class_smtpServer.py @@ -35,7 +35,6 @@ class SmtpServerChannelException(Exception): class smtpServerChannel(smtpd.SMTPChannel): """Asyncore channel for SMTP protocol (server)""" - def smtp_EHLO(self, arg): """Process an EHLO""" if not arg: @@ -74,7 +73,6 @@ def smtp_DATA(self, arg): class smtpServerPyBitmessage(smtpd.SMTPServer): """Asyncore SMTP server class""" - def handle_accept(self): """Accept a connection""" pair = self.accept() @@ -182,7 +180,6 @@ def process_message(self, peer, mailfrom, rcpttos, data): class smtpServer(StoppableThread): """SMTP server thread""" - def __init__(self, _=None): super(smtpServer, self).__init__(name="smtpServerThread") self.server = smtpServerPyBitmessage(('127.0.0.1', LISTENPORT), None) diff --git a/src/depends.py b/src/depends.py index 3933777648..3f08f4d39f 100755 --- a/src/depends.py +++ b/src/depends.py @@ -436,7 +436,7 @@ def check_dependencies(verbose=False, optional=False): if sys.hexversion < 0x3000000: logger.error( 'PyBitmessage requires Python 3 or greater') - # has_all_dependencies = False + #has_all_dependencies = False sys.exit() # FIXME: This needs to be uncommented when more of the code is python3 compatible diff --git a/src/helper_msgcoding.py b/src/helper_msgcoding.py index 9c2652d6dc..225f352c86 100644 --- a/src/helper_msgcoding.py +++ b/src/helper_msgcoding.py @@ -37,14 +37,12 @@ class MsgDecodeException(Exception): class DecompressionSizeException(MsgDecodeException): # pylint: disable=super-init-not-called """Decompression resulted in too much data (attack protection)""" - def __init__(self, size): self.size = size class MsgEncode(object): """Message encoder class""" - def __init__(self, message, encoding=BITMESSAGE_ENCODING_SIMPLE): self.data = None self.encoding = encoding @@ -88,7 +86,6 @@ def encodeTrivial(self, message): class MsgDecode(object): """Message decoder class""" - def __init__(self, encoding, data): self.encoding = encoding if self.encoding == BITMESSAGE_ENCODING_EXTENDED: diff --git a/src/inventory.py b/src/inventory.py index ccdf245dfb..8356262cd6 100644 --- a/src/inventory.py +++ b/src/inventory.py @@ -21,7 +21,6 @@ class Inventory: Inventory class which uses storage backends to manage the inventory. """ - def __init__(self): self._moduleName = config.safeGet("inventory", "storage") self._realInventory = create_inventory_instance(self._moduleName) diff --git a/src/messagetypes/message.py b/src/messagetypes/message.py index 5989d41c9b..245c753fde 100644 --- a/src/messagetypes/message.py +++ b/src/messagetypes/message.py @@ -5,7 +5,6 @@ class MsgBase(object): # pylint: disable=too-few-public-methods """Base class for message types""" - def __init__(self): self.data = {"": type(self).__name__.lower()} diff --git a/src/network/__init__.py b/src/network/__init__.py index cc7bfb58b2..1851e072de 100644 --- a/src/network/__init__.py +++ b/src/network/__init__.py @@ -12,7 +12,7 @@ def start(config, state): """Start network threads""" import state from .announcethread import AnnounceThread - import network.connectionpool as connectionpool # pylint: disable=relative-import + import network.connectionpool as connectionpool # pylint: disable=relative-import from .addrthread import AddrThread from .dandelion import Dandelion from .downloadthread import DownloadThread diff --git a/src/network/asyncore_pollchoose.py b/src/network/asyncore_pollchoose.py index c8b9e3647d..ccbe2aefad 100644 --- a/src/network/asyncore_pollchoose.py +++ b/src/network/asyncore_pollchoose.py @@ -564,12 +564,12 @@ def del_channel(self, map=None): try: kqueue_poller.pollster.control([select.kevent( fd, select.KQ_FILTER_READ, select.KQ_EV_DELETE)], 0) - except (AttributeError, KeyError, TypeError, IOError, OSError): + except(AttributeError, KeyError, TypeError, IOError, OSError): pass try: kqueue_poller.pollster.control([select.kevent( fd, select.KQ_FILTER_WRITE, select.KQ_EV_DELETE)], 0) - except (AttributeError, KeyError, TypeError, IOError, OSError): + except(AttributeError, KeyError, TypeError, IOError, OSError): pass try: epoll_poller.pollster.unregister(fd) @@ -726,7 +726,7 @@ def close(self): # XXX unresolved # cheap inheritance, used to pass all other attribute # references to the underlying socket object. - # def __getattr__(self, attr): + #def __getattr__(self, attr): # try: # retattr = getattr(self.socket, attr) # except AttributeError: diff --git a/src/network/dandelion.py b/src/network/dandelion.py index 43f36857d8..846b03e17d 100644 --- a/src/network/dandelion.py +++ b/src/network/dandelion.py @@ -28,7 +28,6 @@ class Dandelion: # pylint: disable=old-style-class """Dandelion class for tracking stem/fluff stages.""" - def __init__(self): # currently assignable child stems self.stem = [] diff --git a/src/network/httpd.py b/src/network/httpd.py index a53d740ce1..654566c28d 100644 --- a/src/network/httpd.py +++ b/src/network/httpd.py @@ -69,7 +69,6 @@ def handle_write(self): class HTTPSRequestHandler(HTTPRequestHandler, TLSHandshake): """Handling HTTPS request""" - def __init__(self, sock): if not hasattr(self, '_map'): asyncore.dispatcher.__init__(self, sock) # pylint: disable=non-parent-init-called diff --git a/src/network/objectracker.py b/src/network/objectracker.py index 0c3c752b0f..63425def3f 100644 --- a/src/network/objectracker.py +++ b/src/network/objectracker.py @@ -102,7 +102,7 @@ def handleReceivedInventory(self, hashId): def handleReceivedObject(self, streamNumber, hashid): """Handling received object""" - hashid_bytes = bytes(hashid) + hashid_bytes = bytes(hashid); for i in connectionpool.pool.connections(): if not i.fullyEstablished: continue diff --git a/src/network/receivequeuethread.py b/src/network/receivequeuethread.py index 3dafc15c36..68ad612405 100644 --- a/src/network/receivequeuethread.py +++ b/src/network/receivequeuethread.py @@ -15,7 +15,6 @@ class ReceiveQueueThread(StoppableThread): """This thread processes data received from the network (which is done by the asyncore thread)""" - def __init__(self, num=0): super(ReceiveQueueThread, self).__init__(name="ReceiveQueue_%i" % num) diff --git a/src/network/socks4a.py b/src/network/socks4a.py index 0b16ded223..2758838a27 100644 --- a/src/network/socks4a.py +++ b/src/network/socks4a.py @@ -26,7 +26,6 @@ class Socks4aError(ProxyError): class Socks4a(Proxy): """SOCKS4a proxy class""" - def __init__(self, address=None): Proxy.__init__(self, address) self.ipaddr = None @@ -74,7 +73,6 @@ def proxy_sock_name(self): class Socks4aConnection(Socks4a): """Child SOCKS4a class used for making outbound connections.""" - def __init__(self, address): Socks4a.__init__(self, address=address) @@ -121,7 +119,6 @@ def state_pre_connect(self): class Socks4aResolver(Socks4a): """DNS resolver class using SOCKS4a""" - def __init__(self, host): self.host = host self.port = 8444 diff --git a/src/network/socks5.py b/src/network/socks5.py index 3542efc40d..1838a737fa 100644 --- a/src/network/socks5.py +++ b/src/network/socks5.py @@ -42,7 +42,6 @@ class Socks5Error(ProxyError): class Socks5(Proxy): """A socks5 proxy base class""" - def __init__(self, address=None): Proxy.__init__(self, address) self.ipaddr = None @@ -164,7 +163,6 @@ def proxy_sock_name(self): class Socks5Connection(Socks5): """Child socks5 class used for making outbound connections.""" - def state_auth_done(self): """Request connection to be made""" # Now we can request the actual connection @@ -201,7 +199,6 @@ def state_pre_connect(self): class Socks5Resolver(Socks5): """DNS resolver class using socks5""" - def __init__(self, host): self.host = host self.port = 8444 diff --git a/src/network/tls.py b/src/network/tls.py index 0984108235..2f30fcc025 100644 --- a/src/network/tls.py +++ b/src/network/tls.py @@ -40,12 +40,10 @@ else: sslProtocolCiphers = "AECDH-AES256-SHA" - class TLSDispatcher(AdvancedDispatcher): """TLS functionality for classes derived from AdvancedDispatcher""" # pylint: disable=too-many-instance-attributes, too-many-arguments # pylint: disable=super-init-not-called - def __init__(self, _=None, sock=None, certfile=None, keyfile=None, server_side=False, ciphers=sslProtocolCiphers): self.want_read = self.want_write = True diff --git a/src/pyelliptic/cipher.py b/src/pyelliptic/cipher.py index dedba3a952..2c2c54dac6 100644 --- a/src/pyelliptic/cipher.py +++ b/src/pyelliptic/cipher.py @@ -22,7 +22,6 @@ class Cipher(object): ctx2 = pyelliptic.Cipher("secretkey", iv, 0, ciphername='aes-256-cfb') print ctx2.ciphering(ciphertext) """ - def __init__(self, key, iv, do, ciphername='aes-256-cbc'): """ do == 1 => Encrypt; do == 0 => Decrypt diff --git a/src/pyelliptic/openssl.py b/src/pyelliptic/openssl.py index aadb3e7ef5..deb81644d8 100644 --- a/src/pyelliptic/openssl.py +++ b/src/pyelliptic/openssl.py @@ -100,7 +100,6 @@ class _OpenSSL(object): Wrapper for OpenSSL using ctypes """ # pylint: disable=too-many-statements, too-many-instance-attributes - def __init__(self, library): """ Build the wrapper diff --git a/src/qidenticon.py b/src/qidenticon.py index 92d0b64d81..158a2232d9 100644 --- a/src/qidenticon.py +++ b/src/qidenticon.py @@ -43,7 +43,6 @@ from six.moves import range from PyQt6 import QtCore, QtGui - class IdenticonRendererBase(object): """Encapsulate methods around rendering identicons""" diff --git a/src/singleinstance.py b/src/singleinstance.py index 80eb411b0c..cff9d7946c 100644 --- a/src/singleinstance.py +++ b/src/singleinstance.py @@ -21,7 +21,6 @@ class singleinstance(object): Implements a single instance application by creating a lock file at appdata. """ - def __init__(self, flavor_id="", daemon=False): self.initialized = False self.counter = 0 diff --git a/src/storage/sqlite.py b/src/storage/sqlite.py index 38d9fd95fe..6f810a1664 100644 --- a/src/storage/sqlite.py +++ b/src/storage/sqlite.py @@ -11,7 +11,6 @@ class SqliteInventory(InventoryStorage): """Inventory using SQLite""" - def __init__(self): super(SqliteInventory, self).__init__() # of objects (like msg payloads and pubkey payloads) diff --git a/src/tr.py b/src/tr.py index f26dcdffc7..06e2e5d823 100644 --- a/src/tr.py +++ b/src/tr.py @@ -15,7 +15,6 @@ class translateClass: when we are in daemon mode and not using any QT functions. """ # pylint: disable=old-style-class,too-few-public-methods - def __init__(self, context, text): self.context = context self.text = text From 74bb8763e90f543b6dfc5358ded49e5db2c2f836 Mon Sep 17 00:00:00 2001 From: Kashiko Koibumi Date: Sat, 18 May 2024 10:24:00 +0900 Subject: [PATCH 24/32] fix small failures in migrating to Python3 + PyQt6 --- src/bitmessageqt/__init__.py | 18 +++++++------- src/bitmessageqt/foldertree.py | 1 - src/class_addressGenerator.py | 4 ++-- src/class_objectProcessor.py | 20 ++++++++-------- src/class_singleWorker.py | 38 +++++++++++++++--------------- src/depends.py | 4 ++-- src/helper_msgcoding.py | 10 +++----- src/network/__init__.py | 2 +- src/network/asyncore_pollchoose.py | 2 +- src/network/bmproto.py | 11 ++++----- src/network/tcp.py | 5 +--- src/network/tls.py | 3 +-- src/randomtrackingdict.py | 1 - 13 files changed, 53 insertions(+), 66 deletions(-) diff --git a/src/bitmessageqt/__init__.py b/src/bitmessageqt/__init__.py index aaf2f24319..2ecd8e4083 100644 --- a/src/bitmessageqt/__init__.py +++ b/src/bitmessageqt/__init__.py @@ -53,7 +53,7 @@ from .statusbar import BMStatusBar import bitmessageqt.sound as sound # This is needed for tray icon -import bitmessageqt.bitmessage_icons_rc as bitmessage_icons_rc # noqa:F401 pylint: disable=unused-import +import bitmessageqt.bitmessage_icons_rc as bitmessage_icons_rc # noqa:F401 pylint: disable=unused-import import helper_sent try: @@ -1419,7 +1419,7 @@ def notifierShow( self, title, subtitle, category, label=None, icon=QtWidgets.QSystemTrayIcon.MessageIcon.Information): self.playSound(category, label) self._notifier( - str(title), str(subtitle), category, label, icon) + title, subtitle, category, label, icon) # tree def treeWidgetKeyPressEvent(self, event): @@ -2860,7 +2860,6 @@ def on_action_InboxMessageForceHtml(self): lines[i] = '

' content = ' '.join(lines) # To keep the whitespace between lines content = shared.fixPotentiallyInvalidUTF8Data(content) - content = content textEdit.setHtml(content) def on_action_InboxMarkUnread(self): @@ -3786,20 +3785,20 @@ def on_action_AddressBookSetSound(self): self.setAddressSound(widget.item(widget.currentRow(), 0).text()) def setAddressSound(self, addr): - filters = [str(_translate( + filters = [_translate( "MainWindow", "Sound files (%s)" % ' '.join(['*%s%s' % (os.extsep, ext) for ext in sound.extensions]) - ))] - sourcefile = str(QtWidgets.QFileDialog.getOpenFileName( + )] + sourcefile = QtWidgets.QFileDialog.getOpenFileName( self, _translate("MainWindow", "Set notification sound..."), filter=';;'.join(filters) - )) + ) if not sourcefile: return destdir = os.path.join(state.appdata, 'sounds') - destfile = str(addr) + os.path.splitext(sourcefile)[-1] + destfile = addr + os.path.splitext(sourcefile)[-1] destination = os.path.join(destdir, destfile) if sourcefile == destination: @@ -3952,7 +3951,6 @@ def on_context_menuSent(self, point): def inboxSearchLineEditUpdated(self, text): # dynamic search for too short text is slow - text = text if 0 < len(text) < 3: return messagelist = self.getCurrentMessagelist() @@ -4080,7 +4078,7 @@ def tableWidgetAddressBookItemChanged(self, item): self.rerenderMessagelistToLabels() completerList = self.ui.lineEditTo.completer().model().stringList() for i in range(len(completerList)): - if str(completerList[i]).endswith(" <" + item.address + ">"): + if completerList[i].endswith(" <" + item.address + ">"): completerList[i] = item.label + " <" + item.address + ">" self.ui.lineEditTo.completer().model().setStringList(completerList) diff --git a/src/bitmessageqt/foldertree.py b/src/bitmessageqt/foldertree.py index 896b355d53..13d7ba777b 100644 --- a/src/bitmessageqt/foldertree.py +++ b/src/bitmessageqt/foldertree.py @@ -135,7 +135,6 @@ def defaultLabel(self): if queryreturn != []: for row in queryreturn: retval, = row - retval = retval elif self.address is None or self.type == AccountMixin.ALL: return _translate("MainWindow", "All accounts") diff --git a/src/class_addressGenerator.py b/src/class_addressGenerator.py index 800ea241de..feed720eb6 100644 --- a/src/class_addressGenerator.py +++ b/src/class_addressGenerator.py @@ -142,7 +142,7 @@ def run(self): ): break self.logger.info( - 'Generated address with ripe digest: %s', hexlify(ripe)) + 'Generated address with ripe digest: %s', hexlify(ripe).decode()) try: self.logger.info( 'Address generator calculated %s addresses at %s' @@ -255,7 +255,7 @@ def run(self): break self.logger.info( - 'Generated address with ripe digest: %s', hexlify(ripe)) + 'Generated address with ripe digest: %s', hexlify(ripe).decode()) try: self.logger.info( 'Address generator calculated %s addresses' diff --git a/src/class_objectProcessor.py b/src/class_objectProcessor.py index 1a71f929d6..d9920f4a17 100644 --- a/src/class_objectProcessor.py +++ b/src/class_objectProcessor.py @@ -153,7 +153,7 @@ def checkackdata(data): data[readPosition:], _translate( "MainWindow", - "Acknowledgement of the message received {}" + "Acknowledgement of the message received {0}" ).format(l10n.formatTimestamp())) )) else: @@ -326,8 +326,8 @@ def processpubkey(self, data): 'within recpubkey, addressVersion: %s, streamNumber: %s' '\nripe %s\npublicSigningKey in hex: %s' '\npublicEncryptionKey in hex: %s', - addressVersion, streamNumber, hexlify(ripe), - hexlify(publicSigningKey), hexlify(publicEncryptionKey) + addressVersion, streamNumber, hexlify(ripe).decode(), + hexlify(publicSigningKey).decode(), hexlify(publicEncryptionKey).decode() ) address = encodeAddress(addressVersion, streamNumber, ripe) @@ -391,8 +391,8 @@ def processpubkey(self, data): 'within recpubkey, addressVersion: %s, streamNumber: %s' '\nripe %s\npublicSigningKey in hex: %s' '\npublicEncryptionKey in hex: %s', - addressVersion, streamNumber, hexlify(ripe), - hexlify(publicSigningKey), hexlify(publicEncryptionKey) + addressVersion, streamNumber, hexlify(ripe).decode(), + hexlify(publicSigningKey).decode(), hexlify(publicEncryptionKey).decode() ) address = encodeAddress(addressVersion, streamNumber, ripe) @@ -481,7 +481,7 @@ def processmsg(self, data): initialDecryptionSuccessful = True logger.info( 'EC decryption successful using key associated' - ' with ripe hash: %s.', hexlify(key)) + ' with ripe hash: %s.', hexlify(key).decode()) except Exception: # nosec B110 pass if not initialDecryptionSuccessful: @@ -544,8 +544,8 @@ def processmsg(self, data): ' Attack.\nSee: ' 'http://world.std.com/~dtd/sign_encrypt/sign_encrypt7.html' '\nyour toRipe: %s\nembedded destination toRipe: %s', - hexlify(toRipe), - hexlify(decryptedData[readPosition:readPosition + 20]) + hexlify(toRipe).decode(), + hexlify(decryptedData[readPosition:readPosition + 20]).decode() ) readPosition += 20 messageEncodingType, messageEncodingTypeLength = decodeVarint( @@ -808,9 +808,9 @@ def processbroadcast(self, data): logger.info( 'EC decryption successful using key associated' ' with ripe hash: %s', hexlify(key).decode()) - except Exception as ex: + except Exception: logger.debug( - 'cryptorObject.decrypt Exception: {}'.format(ex)) + 'cryptorObject.decrypt Exception:', exc_info=True) if not initialDecryptionSuccessful: # This is not a broadcast I am interested in. return logger.debug( diff --git a/src/class_singleWorker.py b/src/class_singleWorker.py index 7a41f3c1b4..846467e539 100644 --- a/src/class_singleWorker.py +++ b/src/class_singleWorker.py @@ -146,38 +146,38 @@ def run(self): if command == 'sendmessage': try: self.sendMsg() - except Exception as ex: # noqa:E722 - self.logger.warning("sendMsg didn't work: {}".format(ex)) + except: # noqa:E722 + self.logger.warning("sendMsg didn't work") elif command == 'sendbroadcast': try: self.sendBroadcast() - except Exception as ex: # noqa:E722 - self.logger.warning("sendBroadcast didn't work: {}".format(ex)) + except: # noqa:E722 + self.logger.warning("sendBroadcast didn't work") elif command == 'doPOWForMyV2Pubkey': try: self.doPOWForMyV2Pubkey(data) - except Exception as ex: # noqa:E722 - self.logger.warning("doPOWForMyV2Pubkey didn't work: {}".format(ex)) + except: # noqa:E722 + self.logger.warning("doPOWForMyV2Pubkey didn't work") elif command == 'sendOutOrStoreMyV3Pubkey': try: self.sendOutOrStoreMyV3Pubkey(data) - except Exception as ex: # noqa:E722 - self.logger.warning("sendOutOrStoreMyV3Pubkey didn't work: {}".format(ex)) + except: # noqa:E722 + self.logger.warning("sendOutOrStoreMyV3Pubkey didn't work") elif command == 'sendOutOrStoreMyV4Pubkey': try: self.sendOutOrStoreMyV4Pubkey(data) - except Exception as ex: # noqa:E722 - self.logger.warning("sendOutOrStoreMyV4Pubkey didn't work: {}".format(ex)) + except: # noqa:E722 + self.logger.warning("sendOutOrStoreMyV4Pubkey didn't work") elif command == 'sendOnionPeerObj': try: self.sendOnionPeerObj(data) - except Exception as ex: # noqa:E722 - self.logger.warning("sendOnionPeerObj didn't work: {}".format(ex)) + except: # noqa:E722 + self.logger.warning("sendOnionPeerObj didn't work") elif command == 'resetPoW': try: proofofwork.resetPoW() - except Exception as ex: # noqa:E722 - self.logger.warning("proofofwork.resetPoW didn't work: {}".format(ex)) + except: # noqa:E722 + self.logger.warning("proofofwork.resetPoW didn't work") elif command == 'stopThread': self.busy = 0 return @@ -1230,8 +1230,8 @@ def sendMsg(self): encrypted = highlevelcrypto.encrypt( payload, b"04" + hexlify(pubEncryptionKeyBase256) ) - except Exception as ex: # noqa:E722 - self.logger.warning("highlevelcrypto.encrypt didn't work: {}".format(ex)) + except: # noqa:E722 + self.logger.warning("highlevelcrypto.encrypt didn't work") sqlExecute( '''UPDATE sent SET status='badkey' WHERE ackdata=? AND folder='sent' ''', ackdata @@ -1282,8 +1282,8 @@ def sendMsg(self): time.time() - powStartTime, sizeof_fmt(nonce / (time.time() - powStartTime)) ) - except Exception as ex: # noqa:E722 - self.logger.warning("Proof of Work exception: {}".format(ex)) + except: # noqa:E722 + self.logger.warning("Proof of Work exception") encryptedPayload = pack('>Q', nonce) + encryptedPayload @@ -1485,7 +1485,7 @@ def requestPubKey(self, toAddress): tr._translate( "MainWindow", "Sending public key request. Waiting for reply." - " Requested at %1" + " Requested at {0}" ).format(l10n.formatTimestamp())) )) diff --git a/src/depends.py b/src/depends.py index 3f08f4d39f..c894faada0 100755 --- a/src/depends.py +++ b/src/depends.py @@ -435,8 +435,8 @@ def check_dependencies(verbose=False, optional=False): logger.info('Python version: %s', sys.version) if sys.hexversion < 0x3000000: logger.error( - 'PyBitmessage requires Python 3 or greater') - #has_all_dependencies = False + 'PyBitmessage does not support Python 2.7-. Python 3' + ' or greater is required.') sys.exit() # FIXME: This needs to be uncommented when more of the code is python3 compatible diff --git a/src/helper_msgcoding.py b/src/helper_msgcoding.py index 225f352c86..8aa8dc0fb0 100644 --- a/src/helper_msgcoding.py +++ b/src/helper_msgcoding.py @@ -71,16 +71,12 @@ def encodeExtended(self, message): def encodeSimple(self, message): """Handle simple encoding""" - data = 'Subject:%(subject)s\nBody:%(body)s' % message - self.data = data.encode('utf-8', 'backslashreplace') + self.data = ('Subject:%(subject)s\nBody:%(body)s' % message).encode() self.length = len(self.data) def encodeTrivial(self, message): """Handle trivial encoding""" - data = message['body'] - if isinstance(data, str): - data = data.encode('utf-8', 'backslashreplace') - self.data = data + self.data = message['body'].encode() self.length = len(self.data) @@ -146,7 +142,7 @@ def decodeExtended(self, data): def decodeSimple(self, data): """Handle simple encoding""" - data = data.decode('utf-8', 'backslashreplace') + data = data.decode('utf-8', 'replace') bodyPositionIndex = data.find('\nBody:') if bodyPositionIndex > 1: subject = data[8:bodyPositionIndex] diff --git a/src/network/__init__.py b/src/network/__init__.py index 1851e072de..cc7bfb58b2 100644 --- a/src/network/__init__.py +++ b/src/network/__init__.py @@ -12,7 +12,7 @@ def start(config, state): """Start network threads""" import state from .announcethread import AnnounceThread - import network.connectionpool as connectionpool # pylint: disable=relative-import + import network.connectionpool as connectionpool # pylint: disable=relative-import from .addrthread import AddrThread from .dandelion import Dandelion from .downloadthread import DownloadThread diff --git a/src/network/asyncore_pollchoose.py b/src/network/asyncore_pollchoose.py index ccbe2aefad..f37c9df886 100644 --- a/src/network/asyncore_pollchoose.py +++ b/src/network/asyncore_pollchoose.py @@ -723,9 +723,9 @@ def close(self): if why.args[0] not in (ENOTCONN, EBADF): raise - # XXX unresolved # cheap inheritance, used to pass all other attribute # references to the underlying socket object. + # XXX unresolved: is this can be removed safely or not? #def __getattr__(self, attr): # try: # retattr = getattr(self.socket, attr) diff --git a/src/network/bmproto.py b/src/network/bmproto.py index 4ef131d8cb..be7ea79516 100644 --- a/src/network/bmproto.py +++ b/src/network/bmproto.py @@ -110,16 +110,15 @@ def state_bm_command(self): # pylint: disable=too-many-branches b"error", b"version", b"verack"): logger.error( 'Received command %s before connection was fully' - ' established, ignoring', self.command.decode('utf-8', 'replace')) + ' established, ignoring', self.command) self.invalid = True if not self.invalid: try: retval = getattr( self, "bm_command_" + self.command.decode('utf-8', 'replace').lower())() - except AttributeError as err: - logger.debug('command = {}, err = {}'.format(self.command.decode('utf-8', 'replace'), err)) + except AttributeError: # unimplemented command - logger.debug('unimplemented command %s', self.command.decode('utf-8', 'replace')) + logger.debug('unimplemented command %s', self.command) except BMProtoInsufficientDataError: logger.debug('packet length too short, skipping') except BMProtoExcessiveDataError: @@ -142,8 +141,8 @@ def state_bm_command(self): # pylint: disable=too-many-branches # broken read, ignore pass else: - logger.debug('Closing due to invalid command %s', self.command.decode('utf-8', 'replace')) - self.close_reason = "Invalid command %s" % self.command.decode('utf-8', 'replace') + 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: diff --git a/src/network/tcp.py b/src/network/tcp.py index 75768f2252..a49804a657 100644 --- a/src/network/tcp.py +++ b/src/network/tcp.py @@ -184,10 +184,7 @@ def endsWith(s, tail): try: return s.endswith(tail) except: - try: - return s.decode('ascii').endswith(tail) - except UnicodeDecodeError: - return False + return s.decode('utf-8', 'replace').endswith(tail) templist = [] addrs = {} diff --git a/src/network/tls.py b/src/network/tls.py index 2f30fcc025..59dfc0821d 100644 --- a/src/network/tls.py +++ b/src/network/tls.py @@ -92,6 +92,7 @@ def do_tls_init(self): ciphers=self.ciphers, do_handshake_on_connect=False) self.sslSocket.setblocking(0) self.want_read = self.want_write = True + self.tlsPrepared = True return False @staticmethod @@ -139,7 +140,6 @@ def handle_read(self): if self.tlsStarted and not self.tlsDone and not self.write_buf: if not self.tlsPrepared: self.do_tls_init() - self.tlsPrepared = True else: self.tls_handshake() else: @@ -165,7 +165,6 @@ def handle_write(self): if self.tlsStarted and not self.tlsDone and not self.write_buf: if not self.tlsPrepared: self.do_tls_init() - self.tlsPrepared = True else: self.tls_handshake() else: diff --git a/src/randomtrackingdict.py b/src/randomtrackingdict.py index 1435180a77..0944da2a8a 100644 --- a/src/randomtrackingdict.py +++ b/src/randomtrackingdict.py @@ -3,7 +3,6 @@ """ from threading import RLock from time import time -from binascii import hexlify try: import helper_random From bc254a935e4b9a437b31c2a8d42dca9f46914c3c Mon Sep 17 00:00:00 2001 From: Kashiko Koibumi Date: Sat, 18 May 2024 11:12:49 +0900 Subject: [PATCH 25/32] eliminate semicolons --- src/bitmessageqt/__init__.py | 2 +- src/network/objectracker.py | 2 +- src/tr.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/bitmessageqt/__init__.py b/src/bitmessageqt/__init__.py index 2ecd8e4083..f454023c42 100644 --- a/src/bitmessageqt/__init__.py +++ b/src/bitmessageqt/__init__.py @@ -1221,7 +1221,7 @@ def loadMessagelist( # create application indicator def appIndicatorInit(self, app): self.initTrayIcon("can-icon-24px-red.png", app) - self.tray.activated.connect(self.__icon_activated); + self.tray.activated.connect(self.__icon_activated) m = QtWidgets.QMenu() diff --git a/src/network/objectracker.py b/src/network/objectracker.py index 63425def3f..0c3c752b0f 100644 --- a/src/network/objectracker.py +++ b/src/network/objectracker.py @@ -102,7 +102,7 @@ def handleReceivedInventory(self, hashId): def handleReceivedObject(self, streamNumber, hashid): """Handling received object""" - hashid_bytes = bytes(hashid); + hashid_bytes = bytes(hashid) for i in connectionpool.pool.connections(): if not i.fullyEstablished: continue diff --git a/src/tr.py b/src/tr.py index 06e2e5d823..6196952352 100644 --- a/src/tr.py +++ b/src/tr.py @@ -41,7 +41,7 @@ def translateText(context, text, n=None): enableGUI = True if enableGUI: try: - from PyQt6 import QtCore, QtGui, QtWidgets + from PyQt6 import QtWidgets except Exception as err: print('PyBitmessage requires PyQt unless you want to run it as a daemon' ' and interact with it using the API.' From 3f808fbcd772c138f744d551114688fa22363609 Mon Sep 17 00:00:00 2001 From: Kashiko Koibumi Date: Sat, 18 May 2024 12:13:24 +0900 Subject: [PATCH 26/32] fix to pass tests.py * deterministic_keys() now accepts both str and bytes for passphrase. * The test for RandomTrackingDict is modified to use bytes for random keys. --- src/highlevelcrypto.py | 7 ++++++- src/tests/test_randomtrackingdict.py | 8 ++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/highlevelcrypto.py b/src/highlevelcrypto.py index 551aa376b4..e0b86f3502 100644 --- a/src/highlevelcrypto.py +++ b/src/highlevelcrypto.py @@ -85,7 +85,12 @@ def random_keys(): def deterministic_keys(passphrase, nonce): """Generate keys from *passphrase* and *nonce* (encoded as varint)""" - priv = hashlib.sha512(passphrase.encode() + nonce).digest()[:32] + if isinstance(passphrase, str): + ph = passphrase.encode() + else: + ph = passphrase + priv = hashlib.sha512(ph + nonce).digest()[:32] + pub = pointMult(priv) return priv, pub diff --git a/src/tests/test_randomtrackingdict.py b/src/tests/test_randomtrackingdict.py index 2db3c42379..cbe0ee55ba 100644 --- a/src/tests/test_randomtrackingdict.py +++ b/src/tests/test_randomtrackingdict.py @@ -15,10 +15,10 @@ class TestRandomTrackingDict(unittest.TestCase): @staticmethod def randString(): """helper function for tests, generates a random string""" - retval = '' - for _ in range(32): - retval += chr(random.randint(0, 255)) - return retval + retval = bytearray(32) + for i in range(32): + retval[i] = random.randint(0, 255) + return bytes(retval) def test_check_randomtrackingdict(self): """Check the logic of RandomTrackingDict class""" From af52f80c71fda6e45af4d5ddb726aa7704c569f2 Mon Sep 17 00:00:00 2001 From: Kashiko Koibumi Date: Sat, 18 May 2024 23:27:06 +0900 Subject: [PATCH 27/32] fix to run with python3-prctl --- src/threads.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/threads.py b/src/threads.py index ac8bf7a6d5..db8f96e43a 100644 --- a/src/threads.py +++ b/src/threads.py @@ -32,13 +32,6 @@ def set_thread_name(name): """Set the thread name for external use (visible from the OS).""" prctl.set_name(name) - def _thread_name_hack(self): - set_thread_name(self.name) - threading.Thread.__bootstrap_original__(self) - # pylint: disable=protected-access - threading.Thread.__bootstrap_original__ = threading.Thread._Thread__bootstrap - threading.Thread._Thread__bootstrap = _thread_name_hack - printLock = threading.Lock() From 336808980f87b6815f3ee736432aa8769a9f8a01 Mon Sep 17 00:00:00 2001 From: Kashiko Koibumi Date: Sun, 19 May 2024 08:19:55 +0900 Subject: [PATCH 28/32] load data as 'bytes' instead of 'str' from SQLite --- .gitignore | 1 + src/addresses.py | 24 ++++++++++++------------ src/bitmessageqt/__init__.py | 28 +++++++++++++++++++++++++++- src/bitmessageqt/account.py | 14 ++++++++++---- src/bitmessageqt/blacklist.py | 18 ++++++++++-------- src/bitmessageqt/foldertree.py | 3 +++ src/class_singleCleaner.py | 2 ++ src/class_singleWorker.py | 9 +++++++++ src/class_sqlThread.py | 6 +++--- src/shared.py | 3 ++- src/tests/test_shared.py | 6 +++--- 11 files changed, 82 insertions(+), 32 deletions(-) diff --git a/.gitignore b/.gitignore index 6bc048a586..8a65576224 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,4 @@ coverage.xml .buildozer .tox *.swp +typescript diff --git a/src/addresses.py b/src/addresses.py index 885c1f649f..6859a9ca0e 100644 --- a/src/addresses.py +++ b/src/addresses.py @@ -187,7 +187,7 @@ def decodeAddress(address): integer = decodeBase58(address) if integer == 0: status = 'invalidcharacters' - return status, 0, 0, '' + return status, 0, 0, b'' # after converting to hex, the string will be prepended # with a 0x and appended with a L in python2 hexdata = hex(integer)[2:].rstrip('L') @@ -200,23 +200,23 @@ def decodeAddress(address): if checksum != double_sha512(data[:-4])[0:4]: status = 'checksumfailed' - return status, 0, 0, '' + return status, 0, 0, b'' try: addressVersionNumber, bytesUsedByVersionNumber = decodeVarint(data[:9]) except varintDecodeError as e: logger.error(str(e)) status = 'varintmalformed' - return status, 0, 0, '' + return status, 0, 0, b'' if addressVersionNumber > 4: logger.error('cannot decode address version numbers this high') status = 'versiontoohigh' - return status, 0, 0, '' + return status, 0, 0, b'' elif addressVersionNumber == 0: logger.error('cannot decode address version numbers of zero.') status = 'versiontoohigh' - return status, 0, 0, '' + return status, 0, 0, b'' try: streamNumber, bytesUsedByStreamNumber = \ @@ -224,7 +224,7 @@ def decodeAddress(address): except varintDecodeError as e: logger.error(str(e)) status = 'varintmalformed' - return status, 0, 0, '' + return status, 0, 0, b'' status = 'success' if addressVersionNumber == 1: @@ -242,21 +242,21 @@ def decodeAddress(address): return status, addressVersionNumber, streamNumber, \ b'\x00\x00' + embeddedRipeData elif len(embeddedRipeData) < 18: - return 'ripetooshort', 0, 0, '' + return 'ripetooshort', 0, 0, b'' elif len(embeddedRipeData) > 20: - return 'ripetoolong', 0, 0, '' - return 'otherproblem', 0, 0, '' + return 'ripetoolong', 0, 0, b'' + return 'otherproblem', 0, 0, b'' elif addressVersionNumber == 4: embeddedRipeData = \ data[bytesUsedByVersionNumber + bytesUsedByStreamNumber:-4] if embeddedRipeData[0:1] == b'\x00': # In order to enforce address non-malleability, encoded # RIPE data must have NULL bytes removed from the front - return 'encodingproblem', 0, 0, '' + return 'encodingproblem', 0, 0, b'' elif len(embeddedRipeData) > 20: - return 'ripetoolong', 0, 0, '' + return 'ripetoolong', 0, 0, b'' elif len(embeddedRipeData) < 4: - return 'ripetooshort', 0, 0, '' + return 'ripetooshort', 0, 0, b'' x00string = b'\x00' * (20 - len(embeddedRipeData)) return status, addressVersionNumber, streamNumber, \ x00string + embeddedRipeData diff --git a/src/bitmessageqt/__init__.py b/src/bitmessageqt/__init__.py index f454023c42..5ab7a4d0c4 100644 --- a/src/bitmessageqt/__init__.py +++ b/src/bitmessageqt/__init__.py @@ -515,6 +515,8 @@ def rerenderTabTree(self, tab): "GROUP BY toaddress, folder") for row in queryreturn: toaddress, folder, cnt = row + toaddress = toaddress.decode('utf-8', 'replace') + folder = folder.decode('utf-8', 'replace') total += cnt if toaddress in db and folder in db[toaddress]: db[toaddress][folder] = cnt @@ -966,6 +968,8 @@ def propagateUnreadCount(self, folder=None, widget=None): normalUnread = {} broadcastsUnread = {} for addr, fld, count in queryReturn: + addr = addr.decode('utf-8', 'replace') + fld = fld.decode('utf-8', 'replace') try: normalUnread[addr][fld] = count except KeyError: @@ -1165,6 +1169,13 @@ def loadSent(self, tableWidget, account, where="", what=""): xAddress, account, "sent", where, what, False) for row in queryreturn: + r = [] + r.append(row[0].decode('utf-8', 'replace')) # toaddress + r.append(row[1].decode('utf-8', 'replace')) # fromaddress + r.append(row[2].decode('utf-8', 'replace')) # subject + r.append(row[3].decode('utf-8', 'replace')) # status + r.append(row[4]) # ackdata + r.append(row[5]) # lastactiontime self.addMessageListItemSent(tableWidget, *row) tableWidget.horizontalHeader().setSortIndicator( @@ -1206,6 +1217,10 @@ def loadMessagelist( for row in queryreturn: toAddress, fromAddress, subject, _, msgid, received, read = row + toAddress = toAddress.decode('utf-8', 'replace') + fromAddress = fromAddress.decode('utf-8', 'replace') + subject = subject.decode('utf-8', 'replace') + received = received.decode('utf-8', 'replace') self.addMessageListItemInbox( tableWidget, toAddress, fromAddress, subject, msgid, received, read) @@ -1289,6 +1304,7 @@ def getUnread(self): SELECT msgid, toaddress, read FROM inbox where folder='inbox' ''') for msgid, toAddress, read in queryreturn: + toAddress = toAddress.decode('utf-8', 'replace') if not read: # increment the unread subscriptions if True (1) @@ -1367,7 +1383,7 @@ def _choose_ext(basename): # Adapters and converters for QT <-> sqlite def sqlInit(self): - register_adapter(QtCore.QByteArray, str) + register_adapter(QtCore.QByteArray, bytes) def indicatorInit(self): """ @@ -1939,6 +1955,8 @@ def addRow (address, label, type): queryreturn = sqlQuery('SELECT label, address FROM subscriptions WHERE enabled = 1') for row in queryreturn: label, address = row + label = label.decode('utf-8', 'replace') + address = address.decode('utf-8', 'replace') newRows[address] = [label, AccountMixin.SUBSCRIPTION] # chans for address in config.addresses(True): @@ -1949,6 +1967,8 @@ def addRow (address, label, type): queryreturn = sqlQuery('SELECT * FROM addressbook') for row in queryreturn: label, address = row + label = label.decode('utf-8', 'replace') + address = address.decode('utf-8', 'replace') newRows[address] = [label, AccountMixin.NORMAL] completerList = [] @@ -2199,6 +2219,7 @@ def click_pushButtonSend(self): if queryreturn != []: for row in queryreturn: toLabel, = row + toLabel = toLabel.decode('utf-8', 'replace') self.displayNewSentMessage( toAddress, toLabel, fromAddress, subject, message, ackdata) @@ -2846,6 +2867,7 @@ def on_action_InboxMessageForceHtml(self): if queryreturn != []: for row in queryreturn: messageText, = row + messageText = messageText.decode('utf-8', 'replace') lines = messageText.split('\n') totalLines = len(lines) @@ -2968,6 +2990,7 @@ def on_action_InboxReply(self, reply_type=None): if queryreturn != []: for row in queryreturn: messageAtCurrentInboxRow, = row + messageAtCurrentInboxRow = messageAtCurrentInboxRow.decode('utf-8', 'replace') acct.parseMessage( toAddressAtCurrentInboxRow, fromAddressAtCurrentInboxRow, tableWidget.item(currentInboxRow, 2).subject, @@ -3199,6 +3222,7 @@ def on_action_InboxSaveMessageAs(self): if queryreturn != []: for row in queryreturn: message, = row + message = message.decode('utf-8', 'replace') defaultFilename = "".join(x for x in subjectAtCurrentInboxRow if x.isalnum()) + '.txt' filename = QtWidgets.QFileDialog.getSaveFileName( @@ -3944,6 +3968,7 @@ def on_context_menuSent(self, point): queryreturn = sqlQuery('''SELECT status FROM sent where ackdata=?''', ackData) for row in queryreturn: status, = row + status = status.decode('utf-8', 'replace') if status == 'toodifficult': self.popMenuSent.addAction(self.actionForceSend) @@ -4047,6 +4072,7 @@ def tableWidgetInboxItemClicked(self): try: message = queryreturn[-1][0] + message = message.decode('utf-8', 'replace') except NameError: message = "" except IndexError: diff --git a/src/bitmessageqt/account.py b/src/bitmessageqt/account.py index fb21ec8dd0..e93bb3b35f 100644 --- a/src/bitmessageqt/account.py +++ b/src/bitmessageqt/account.py @@ -38,6 +38,8 @@ def getSortedSubscriptions(count=False): ret = {} for row in queryreturn: label, address, enabled = row + label = label.decode('utf-8', 'replace') + address = address.decode('utf-8', 'replace') ret[address] = {} ret[address]["inbox"] = {} ret[address]["inbox"]['label'] = label @@ -50,6 +52,8 @@ def getSortedSubscriptions(count=False): GROUP BY inbox.fromaddress, folder''', str_broadcast_subscribers) for row in queryreturn: address, folder, cnt = row + address = address.decode('utf-8', 'replace') + folder = folder.decode('utf-8', 'replace') if folder not in ret[address]: ret[address][folder] = { 'label': ret[address]['inbox']['label'], @@ -137,12 +141,14 @@ def getLabel(self, address=None): if queryreturn != []: for row in queryreturn: label, = row + label = label.decode('utf-8', 'replace') else: queryreturn = sqlQuery( '''select label from subscriptions where address=?''', address) if queryreturn != []: for row in queryreturn: label, = row + label = label.decode('utf-8', 'replace') return label def parseMessage(self, toAddress, fromAddress, subject, message): @@ -199,11 +205,11 @@ def send(self): sqlExecute( '''INSERT INTO sent VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)''', '', - self.toAddress, + self.toAddress.encode(), ripe, - self.fromAddress, - self.subject, - self.message, + self.fromAddress.encode(), + self.subject.encode(), + self.message.encode(), ackdata, int(time.time()), # sentTime (this will never change) int(time.time()), # lastActionTime diff --git a/src/bitmessageqt/blacklist.py b/src/bitmessageqt/blacklist.py index 87520c9225..5b3c999774 100644 --- a/src/bitmessageqt/blacklist.py +++ b/src/bitmessageqt/blacklist.py @@ -106,10 +106,10 @@ def tableWidgetBlacklistItemChanged(self, item): if isinstance(addressitem, QtWidgets.QTableWidgetItem): if self.radioButtonBlacklist.isChecked(): sqlExecute('''UPDATE blacklist SET label=? WHERE address=?''', - str(item.text()), str(addressitem.text())) + item.text(), addressitem.text()) else: sqlExecute('''UPDATE whitelist SET label=? WHERE address=?''', - str(item.text()), str(addressitem.text())) + item.text(), addressitem.text()) def init_blacklist_popup_menu(self, connectSignal=True): # Popup menu for the Blacklist page @@ -164,6 +164,8 @@ def rerenderBlackWhiteList(self): self.tableWidgetBlacklist.setSortingEnabled(False) for row in queryreturn: label, address, enabled = row + label = label.decode('utf-8', 'replace') + address = address.decode('utf-8', 'replace') self.tableWidgetBlacklist.insertRow(0) newItem = QtWidgets.QTableWidgetItem(label) if not enabled: @@ -191,11 +193,11 @@ def on_action_BlacklistDelete(self): if config.get('bitmessagesettings', 'blackwhitelist') == 'black': sqlExecute( '''DELETE FROM blacklist WHERE label=? AND address=?''', - str(labelAtCurrentRow), str(addressAtCurrentRow)) + labelAtCurrentRow, addressAtCurrentRow) else: sqlExecute( '''DELETE FROM whitelist WHERE label=? AND address=?''', - str(labelAtCurrentRow), str(addressAtCurrentRow)) + labelAtCurrentRow, addressAtCurrentRow) self.tableWidgetBlacklist.removeRow(currentRow) def on_action_BlacklistClipboard(self): @@ -220,11 +222,11 @@ def on_action_BlacklistEnable(self): if config.get('bitmessagesettings', 'blackwhitelist') == 'black': sqlExecute( '''UPDATE blacklist SET enabled=1 WHERE address=?''', - str(addressAtCurrentRow)) + addressAtCurrentRow) else: sqlExecute( '''UPDATE whitelist SET enabled=1 WHERE address=?''', - str(addressAtCurrentRow)) + addressAtCurrentRow) def on_action_BlacklistDisable(self): currentRow = self.tableWidgetBlacklist.currentRow() @@ -236,10 +238,10 @@ def on_action_BlacklistDisable(self): currentRow, 1).setTextColor(QtGui.QColor(128, 128, 128)) if config.get('bitmessagesettings', 'blackwhitelist') == 'black': sqlExecute( - '''UPDATE blacklist SET enabled=0 WHERE address=?''', str(addressAtCurrentRow)) + '''UPDATE blacklist SET enabled=0 WHERE address=?''', addressAtCurrentRow) else: sqlExecute( - '''UPDATE whitelist SET enabled=0 WHERE address=?''', str(addressAtCurrentRow)) + '''UPDATE whitelist SET enabled=0 WHERE address=?''', addressAtCurrentRow) def on_action_BlacklistSetAvatar(self): self.window().on_action_SetAvatar(self.tableWidgetBlacklist) diff --git a/src/bitmessageqt/foldertree.py b/src/bitmessageqt/foldertree.py index 13d7ba777b..7d4ab49b03 100644 --- a/src/bitmessageqt/foldertree.py +++ b/src/bitmessageqt/foldertree.py @@ -135,6 +135,7 @@ def defaultLabel(self): if queryreturn != []: for row in queryreturn: retval, = row + retval = retval.decode('utf-8', 'replace') elif self.address is None or self.type == AccountMixin.ALL: return _translate("MainWindow", "All accounts") @@ -306,6 +307,7 @@ def _getLabel(self): if queryreturn != []: for row in queryreturn: retval, = row + retval = retval.decode('utf-8', 'replace') return retval return self.address @@ -411,6 +413,7 @@ def setLabel(self, label=None): if queryreturn: for row in queryreturn: newLabel = row[0] + newLabel = newLabel.decode('utf-8', 'replace') self.label = newLabel diff --git a/src/class_singleCleaner.py b/src/class_singleCleaner.py index 06153dcf28..11adf935c6 100644 --- a/src/class_singleCleaner.py +++ b/src/class_singleCleaner.py @@ -99,6 +99,8 @@ def run(self): # pylint: disable=too-many-branches tick - state.maximumLengthOfTimeToBotherResendingMessages ) for toAddress, ackData, status in queryreturn: + toAddress = toAddress.decode('utf-8', 'replace') + status = status.decode('utf-8', 'replace') if status == 'awaitingpubkey': self.resendPubkeyRequest(toAddress) elif status == 'msgsent': diff --git a/src/class_singleWorker.py b/src/class_singleWorker.py index 846467e539..5342cd7906 100644 --- a/src/class_singleWorker.py +++ b/src/class_singleWorker.py @@ -73,6 +73,7 @@ def run(self): '''SELECT DISTINCT toaddress FROM sent''' ''' WHERE (status='awaitingpubkey' AND folder='sent')''') for toAddress, in queryreturn: + toAddress = toAddress.decode('utf-8', 'replace') toAddressVersionNumber, toStreamNumber, toRipe = \ decodeAddress(toAddress)[1:] if toAddressVersionNumber <= 3: @@ -538,6 +539,9 @@ def sendBroadcast(self): for row in queryreturn: fromaddress, subject, body, ackdata, TTL, encoding = row + fromaddress = fromaddress.decode('utf-8', 'replace') + subject = subject.decode('utf-8', 'replace') + body = body.decode('utf-8', 'replace') # status _, addressVersionNumber, streamNumber, ripe = \ decodeAddress(fromaddress) @@ -726,6 +730,11 @@ def sendMsg(self): for row in queryreturn: toaddress, fromaddress, subject, message, \ ackdata, status, TTL, retryNumber, encoding = row + toaddress = toaddress.decode('utf-8', 'replace') + fromaddress = fromaddress.decode('utf-8', 'replace') + subject = subject.decode('utf-8', 'replace') + message = message.decode('utf-8', 'replace') + status = status.decode('utf-8', 'replace') # toStatus _, toAddressVersionNumber, toStreamNumber, toRipe = \ decodeAddress(toaddress) diff --git a/src/class_sqlThread.py b/src/class_sqlThread.py index 7df9e253ac..49e4b98bbb 100644 --- a/src/class_sqlThread.py +++ b/src/class_sqlThread.py @@ -38,7 +38,7 @@ def run(self): # pylint: disable=too-many-locals, too-many-branches, too-many-s helper_sql.sql_available = True config_ready.wait() self.conn = sqlite3.connect(state.appdata + 'messages.dat') - self.conn.text_factory = str + self.conn.text_factory = bytes self.cur = self.conn.cursor() self.cur.execute('PRAGMA secure_delete = true') @@ -542,7 +542,7 @@ def run(self): # pylint: disable=too-many-locals, too-many-branches, too-many-s shutil.move( paths.lookupAppdataFolder() + 'messages.dat', paths.lookupExeFolder() + 'messages.dat') self.conn = sqlite3.connect(paths.lookupExeFolder() + 'messages.dat') - self.conn.text_factory = str + self.conn.text_factory = bytes self.cur = self.conn.cursor() elif item == 'movemessagstoappdata': logger.debug('the sqlThread is moving the messages.dat file to the Appdata folder.') @@ -568,7 +568,7 @@ def run(self): # pylint: disable=too-many-locals, too-many-branches, too-many-s shutil.move( paths.lookupExeFolder() + 'messages.dat', paths.lookupAppdataFolder() + 'messages.dat') self.conn = sqlite3.connect(paths.lookupAppdataFolder() + 'messages.dat') - self.conn.text_factory = str + self.conn.text_factory = bytes self.cur = self.conn.cursor() elif item == 'deleteandvacuume': self.cur.execute('''delete from inbox where folder='trash' ''') diff --git a/src/shared.py b/src/shared.py index a1541eacf9..ec427b2b97 100644 --- a/src/shared.py +++ b/src/shared.py @@ -47,7 +47,7 @@ def isAddressInMySubscriptionsList(address): """Am I subscribed to this address?""" queryreturn = sqlQuery( '''select * from subscriptions where address=?''', - str(address)) + address) return queryreturn != [] @@ -136,6 +136,7 @@ def reloadBroadcastSendersForWhichImWatching(): logger.debug('reloading subscriptions...') for row in queryreturn: address, = row + address = address.decode('utf-8', 'replace') # status addressVersionNumber, streamNumber, hashobj = decodeAddress(address)[1:] if addressVersionNumber == 2: diff --git a/src/tests/test_shared.py b/src/tests/test_shared.py index 39bedf32e1..972430a396 100644 --- a/src/tests/test_shared.py +++ b/src/tests/test_shared.py @@ -46,7 +46,7 @@ def test_isaddress_in_myaddressbook(self, mock_sql_query): address = sample_address # if address is in MyAddressbook - mock_sql_query.return_value = [address] + mock_sql_query.return_value = [address.encode()] return_val = isAddressInMyAddressBook(address) mock_sql_query.assert_called_once() self.assertTrue(return_val) @@ -64,7 +64,7 @@ def test_isaddress_in_mysubscriptionslist(self, mock_sql_query): address = sample_address # if address is in MySubscriptionsList - mock_sql_query.return_value = [address] + mock_sql_query.return_value = [address.encode()] return_val = isAddressInMySubscriptionsList(address) self.assertTrue(return_val) @@ -78,7 +78,7 @@ def test_isaddress_in_mysubscriptionslist(self, mock_sql_query): def test_reloadBroadcastSendersForWhichImWatching(self, mock_sql_query): """Test for reload Broadcast Senders For Which Im Watching""" mock_sql_query.return_value = [ - (sample_address,), + (sample_address.encode(),), ] # before reload self.assertEqual(len(MyECSubscriptionCryptorObjects), 0) From 75d2b36927c7eb9f05106b2d2cedec88cb7489c9 Mon Sep 17 00:00:00 2001 From: Kashiko Koibumi Date: Mon, 20 May 2024 09:44:20 +0900 Subject: [PATCH 29/32] fix UPnP support --- src/upnp.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/upnp.py b/src/upnp.py index 42ff0c6d43..4168b38dd3 100644 --- a/src/upnp.py +++ b/src/upnp.py @@ -4,13 +4,13 @@ Reference: http://mattscodecave.com/posts/using-python-and-upnp-to-forward-a-port """ -import httplib +import http.client import re import socket import time -import urllib2 +from urllib.request import urlopen from random import randint -from urlparse import urlparse +import urllib.parse from xml.dom.minidom import Document # nosec B408 from defusedxml.minidom import parseString @@ -101,14 +101,14 @@ def __init__(self, ssdpResponse, address): header[part[0].lower()] = part[1] try: - self.routerPath = urlparse(header['location']) + self.routerPath = urllib.parse(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() + directory = urlopen(header['location']).read() # create a DOM object that represents the `directory` document dom = parseString(directory) @@ -173,7 +173,7 @@ def GetExternalIPAddress(self): def soapRequest(self, service, action, arguments=None): """Make a request to a router""" - conn = httplib.HTTPConnection(self.routerPath.hostname, self.routerPath.port) + conn = http.client.HTTPConnection(self.routerPath.hostname, self.routerPath.port) conn.request( 'POST', self.path, @@ -315,7 +315,7 @@ def sendSearchRouter(self): try: logger.debug("Sending UPnP query") - self.sock.sendto(ssdpRequest, (uPnPThread.SSDP_ADDR, uPnPThread.SSDP_PORT)) + self.sock.sendto(ssdpRequest.encode(), (uPnPThread.SSDP_ADDR, uPnPThread.SSDP_PORT)) except: # noqa:E722 logger.exception("UPnP send query failed") From 218cc9723cd6832142ba88c9ecfb8d8c1320a24d Mon Sep 17 00:00:00 2001 From: Kashiko Koibumi Date: Mon, 20 May 2024 16:41:15 +0900 Subject: [PATCH 30/32] make daemon mode runnable The error is fixed by making stderr binary mode. --- src/bitmessagemain.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bitmessagemain.py b/src/bitmessagemain.py index 9acd1278a0..826ad88855 100755 --- a/src/bitmessagemain.py +++ b/src/bitmessagemain.py @@ -325,7 +325,7 @@ def daemonize(): if not sys.platform.startswith('win'): si = open(os.devnull, 'r') so = open(os.devnull, 'a+') - se = open(os.devnull, 'a+', 0) + se = open(os.devnull, 'ab+', 0) os.dup2(si.fileno(), sys.stdin.fileno()) os.dup2(so.fileno(), sys.stdout.fileno()) os.dup2(se.fileno(), sys.stderr.fileno()) From b12c7cd9bb7b0de05d65a1bd60bcf44fc4969c76 Mon Sep 17 00:00:00 2001 From: Kashiko Koibumi Date: Wed, 22 May 2024 10:08:47 +0900 Subject: [PATCH 31/32] replace remained arg() with format() --- src/bitmessageqt/dialogs.py | 4 ++-- src/namecoin.py | 18 +++++++++--------- src/network/tcp.py | 4 ++-- src/upnp.py | 4 ++-- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/bitmessageqt/dialogs.py b/src/bitmessageqt/dialogs.py index 9cea3fd828..fd4d8ede83 100644 --- a/src/bitmessageqt/dialogs.py +++ b/src/bitmessageqt/dialogs.py @@ -64,8 +64,8 @@ def __init__(self, parent=None, config=None): self.labelPortNumber.setText(_translate( "iconGlossaryDialog", - "You are using TCP port %1. (This can be changed in the settings)." - ).arg(config.getint('bitmessagesettings', 'port'))) + "You are using TCP port {0}. (This can be changed in the settings)." + ).format(config.getint('bitmessagesettings', 'port'))) self.setFixedSize(QtWidgets.QWidget.sizeHint(self)) diff --git a/src/namecoin.py b/src/namecoin.py index c7307cb037..4996c92dda 100644 --- a/src/namecoin.py +++ b/src/namecoin.py @@ -96,8 +96,8 @@ def query(self, identity): res = res["reply"] if not res: return (_translate( - "MainWindow", "The name %1 was not found." - ).arg(identity.decode("utf-8", "ignore")), None) + "MainWindow", "The name {0} was not found." + ).format(identity.decode("utf-8", "ignore")), None) else: assert False except RPCError as exc: @@ -107,12 +107,12 @@ def query(self, identity): else: errmsg = exc.error return (_translate( - "MainWindow", "The namecoin query failed (%1)" - ).arg(errmsg.decode("utf-8", "ignore")), None) + "MainWindow", "The namecoin query failed ({0})" + ).format(errmsg.decode("utf-8", "ignore")), None) except AssertionError: return (_translate( - "MainWindow", "Unknown namecoin interface type: %1" - ).arg(self.nmctype.decode("utf-8", "ignore")), None) + "MainWindow", "Unknown namecoin interface type: {0}" + ).format(self.nmctype.decode("utf-8", "ignore")), None) except Exception: logger.exception("Namecoin query exception") return (_translate( @@ -135,8 +135,8 @@ def query(self, identity): ) if valid else ( _translate( "MainWindow", - "The name %1 has no associated Bitmessage address." - ).arg(identity.decode("utf-8", "ignore")), None) + "The name {0} has no associated Bitmessage address." + ).format(identity.decode("utf-8", "ignore")), None) def test(self): """ @@ -164,7 +164,7 @@ def test(self): "success", _translate( "MainWindow", - "Success! Namecoind version %1 running.").arg( + "Success! Namecoind version {0} running.").format( versStr.decode("utf-8", "ignore"))) elif self.nmctype == "nmcontrol": diff --git a/src/network/tcp.py b/src/network/tcp.py index a49804a657..dc10c41fae 100644 --- a/src/network/tcp.py +++ b/src/network/tcp.py @@ -138,9 +138,9 @@ def checkTimeOffsetNotification(self): 'updateStatusBar', _translate( "MainWindow", - "The time on your computer, %1, may be wrong. " + "The time on your computer, {0}, may be wrong. " "Please verify your settings." - ).arg(l10n.formatTimestamp()))) + ).format(l10n.formatTimestamp()))) def state_connection_fully_established(self): """ diff --git a/src/upnp.py b/src/upnp.py index 4168b38dd3..f2172bb2b4 100644 --- a/src/upnp.py +++ b/src/upnp.py @@ -269,8 +269,8 @@ def run(self): knownnodes.addKnownNode( 1, self_peer, is_self=True) queues.UISignalQueue.put(('updateStatusBar', tr._translate( - "MainWindow", 'UPnP port mapping established on port %1' - ).arg(str(self.extPort)))) + "MainWindow", 'UPnP port mapping established on port {0}' + ).format(self.extPort))) break except socket.timeout: pass From 4c8bce40b92280f66cbdceb1ff140c2e5fd06fa4 Mon Sep 17 00:00:00 2001 From: Kashiko Koibumi Date: Wed, 29 May 2024 21:44:35 +0900 Subject: [PATCH 32/32] fix type of literals that should be binary --- src/class_objectProcessor.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/class_objectProcessor.py b/src/class_objectProcessor.py index 6e69f110c2..2fd836db57 100644 --- a/src/class_objectProcessor.py +++ b/src/class_objectProcessor.py @@ -302,12 +302,12 @@ def processpubkey(self, data): '(within processpubkey) payloadLength less than 146.' ' Sanity check failed.') readPosition += 4 - pubSigningKey = '\x04' + data[readPosition:readPosition + 64] + pubSigningKey = b'\x04' + data[readPosition:readPosition + 64] # Is it possible for a public key to be invalid such that trying to # encrypt or sign with it will cause an error? If it is, it would # be easiest to test them here. readPosition += 64 - pubEncryptionKey = '\x04' + data[readPosition:readPosition + 64] + pubEncryptionKey = b'\x04' + data[readPosition:readPosition + 64] if len(pubEncryptionKey) < 65: return logger.debug( 'publicEncryptionKey length less than 64. Sanity check'