From 229f803235ae9b9a71313d11071c7a0fbea0a681 Mon Sep 17 00:00:00 2001 From: elijah Date: Mon, 18 Apr 2016 23:44:12 -0700 Subject: [feature] add email panel to preferences --- src/leap/bitmask/gui/preferences_email_page.py | 184 ++++++++++++++++++++++++- 1 file changed, 178 insertions(+), 6 deletions(-) (limited to 'src/leap/bitmask/gui/preferences_email_page.py') diff --git a/src/leap/bitmask/gui/preferences_email_page.py b/src/leap/bitmask/gui/preferences_email_page.py index 3087f343..50f244fb 100644 --- a/src/leap/bitmask/gui/preferences_email_page.py +++ b/src/leap/bitmask/gui/preferences_email_page.py @@ -16,20 +16,192 @@ """ Widget for "email" preferences """ -from PySide import QtGui +from PySide import QtCore, QtGui + +from datetime import datetime from leap.bitmask.logs.utils import get_logger from leap.bitmask.gui.ui_preferences_email_page import Ui_PreferencesEmailPage +from leap.bitmask.gui.preferences_page import PreferencesPage +from leap.mail.imap.service.imap import IMAP_PORT logger = get_logger() - -class PreferencesEmailPage(QtGui.QWidget): +class PreferencesEmailPage(PreferencesPage): def __init__(self, parent, account, app): - QtGui.QWidget.__init__(self, parent) + """ + :param parent: parent object of the PreferencesWindow. + :parent type: QWidget + + :param account: user account (user + provider or just provider) + :type account: Account + + :param app: the current App object + :type app: App + """ + PreferencesPage.__init__(self, parent, account, app) self.ui = Ui_PreferencesEmailPage() self.ui.setupUi(self) - self.account = account - self.app = app + # the only way to set the tab titles is to re-add them: + self.ui.email_tabs.addTab(self.ui.config_tab, + self.tr("Mail Client")) + self.ui.email_tabs.addTab(self.ui.my_key_tab, + self.tr("My Key")) + self.ui.email_tabs.addTab(self.ui.other_keys_tab, + self.tr("Other Keys")) + + # set mail client configuration help text + lang = QtCore.QLocale.system().name().replace('_', '-') + thunderbird_extension_url = \ + "https://addons.mozilla.org/{0}/" \ + "thunderbird/addon/bitmask/".format(lang) + self.ui.thunderbird_label.setText(self.tr( + "For Thunderbird, you can use the Bitmask extension. " + "Search for \"Bitmask\" in the add-on manager or " + "download it from addons.mozilla.org.".format( + thunderbird_extension_url))) + self.ui.mail_client_label.setText(self.tr( + "Alternatively, you can manually configure your mail client to " + "use Bitmask Email with these options:")) + + self.ui.keys_table.horizontalHeader().setResizeMode( + 0, QtGui.QHeaderView.Stretch) + + self.setup_connections() + + + def setup_connections(self): + """ + connect signals + """ + self.app.signaler.keymanager_key_details.connect(self._key_details) + self.app.signaler.keymanager_export_ok.connect( + self._keymanager_export_ok) + self.app.signaler.keymanager_export_error.connect( + self._keymanager_export_error) + self.ui.import_button.clicked.connect(self._import_keys) + self.ui.export_button.clicked.connect(self._export_keys) + + def teardown_connections(self): + """ + disconnect signals + """ + self.app.signaler.keymanager_key_details.disconnect(self._key_details) + self.app.signaler.keymanager_export_ok.disconnect( + self._keymanager_export_ok) + self.app.signaler.keymanager_export_error.disconnect( + self._keymanager_export_error) + + def showEvent(self, event): + """ + called whenever this widget is shown + """ + self.ui.keys_table.clearContents() + + if self.account.username is None: + self.ui.email_tabs.setVisible(False) + self.ui.message_label.setVisible(True) + self.ui.message_label.setText( + self.tr('You must be logged in to edit email settings.')) + else: + self.ui.import_button.setVisible(False) # hide this until working + self.ui.message_label.setVisible(False) + self.ui.email_tabs.setVisible(True) + smtp_port = 2013 + self.ui.imap_port_edit.setText(str(IMAP_PORT)) + self.ui.imap_host_edit.setText("127.0.0.1") + self.ui.smtp_port_edit.setText(str(smtp_port)) + self.ui.smtp_host_edit.setText("127.0.0.1") + self.ui.username_edit.setText(self.account.address) + self.ui.password_edit.setText( + self.app.service_tokens.get('mail_auth', '')) + + self.app.backend.keymanager_list_keys() + self.app.backend.keymanager_get_key_details( + username=self.account.address) + + def _key_details(self, details): + """ + Trigger by signal: keymanager_key_details + Set the current user's key details into the gui. + """ + self.ui.fingerprint_edit.setPlainText( + self._format_fingerprint(details["fingerprint"])) + self.ui.expiration_edit.setText(details["expiry_date"]) + self.ui.uid_edit.setText(" ".join(details["uids"])) + self.ui.public_key_edit.setPlainText(details["key_data"]) + + def _format_fingerprint(self, fingerprint): + """ + formats an openpgp fingerprint in a manner similar to what gpg + produces, wrapped to two lines. + """ + fp = fingerprint.upper() + fp_list = [fp[i:i+4] for i in range(0, len(fp), 4)] + fp_wrapped = " ".join(fp_list[0:5]) + "\n" + " ".join(fp_list[5:10]) + return fp_wrapped + + def _export_keys(self): + """ + Exports the user's key pair. + """ + file_name, filtr = QtGui.QFileDialog.getSaveFileName( + self, self.tr("Save private key file"), + filter="*.pem", + options=QtGui.QFileDialog.DontUseNativeDialog) + + if file_name: + if not file_name.endswith('.pem'): + file_name += '.pem' + self.app.backend.keymanager_export_keys( + username=self.account.address, + filename=file_name) + else: + logger.debug('Export canceled by the user.') + + def _keymanager_export_ok(self): + """ + TRIGGERS: + Signaler.keymanager_export_ok + + Notify the user that the key export went OK. + """ + QtGui.QMessageBox.information( + self, self.tr("Export Successful"), + self.tr("The key pair was exported successfully.\n" + "Please, store your private key in a safe place.")) + + def _keymanager_export_error(self): + """ + TRIGGERS: + Signaler.keymanager_export_error + + Notify the user that the key export didn't go well. + """ + QtGui.QMessageBox.critical( + self, self.tr("Input/Output error"), + self.tr("There was an error accessing the file.\n" + "Export canceled.")) + + def _import_keys(self): + """ + not yet supported + """ + + def _keymanager_keys_list(self, keys): + """ + TRIGGERS: + Signaler.keymanager_keys_list + + Load the keys given as parameter in the table. + + :param keys: the list of keys to load. + :type keys: list + """ + for key in keys: + row = self.ui.keys_table.rowCount() + self.ui.keys_table.insertRow(row) + self.ui.keys_table.setItem(row, 0, QtGui.QTableWidgetItem(key.address)) + self.ui.keys_table.setItem(row, 1, QtGui.QTableWidgetItem(key.fingerprint)) -- cgit v1.2.3 From 5b90ad3552025436edb40665203ab98eceaa065b Mon Sep 17 00:00:00 2001 From: Kali Kaneko Date: Tue, 19 Apr 2016 12:07:09 -0400 Subject: pep8/flake8 --- src/leap/bitmask/gui/preferences_email_page.py | 36 +++++++++++++------------- 1 file changed, 18 insertions(+), 18 deletions(-) (limited to 'src/leap/bitmask/gui/preferences_email_page.py') diff --git a/src/leap/bitmask/gui/preferences_email_page.py b/src/leap/bitmask/gui/preferences_email_page.py index 50f244fb..8211aeb8 100644 --- a/src/leap/bitmask/gui/preferences_email_page.py +++ b/src/leap/bitmask/gui/preferences_email_page.py @@ -18,8 +18,6 @@ Widget for "email" preferences """ from PySide import QtCore, QtGui -from datetime import datetime - from leap.bitmask.logs.utils import get_logger from leap.bitmask.gui.ui_preferences_email_page import Ui_PreferencesEmailPage from leap.bitmask.gui.preferences_page import PreferencesPage @@ -27,6 +25,7 @@ from leap.mail.imap.service.imap import IMAP_PORT logger = get_logger() + class PreferencesEmailPage(PreferencesPage): def __init__(self, parent, account, app): @@ -46,11 +45,11 @@ class PreferencesEmailPage(PreferencesPage): # the only way to set the tab titles is to re-add them: self.ui.email_tabs.addTab(self.ui.config_tab, - self.tr("Mail Client")) + self.tr("Mail Client")) self.ui.email_tabs.addTab(self.ui.my_key_tab, - self.tr("My Key")) + self.tr("My Key")) self.ui.email_tabs.addTab(self.ui.other_keys_tab, - self.tr("Other Keys")) + self.tr("Other Keys")) # set mail client configuration help text lang = QtCore.QLocale.system().name().replace('_', '-') @@ -61,7 +60,7 @@ class PreferencesEmailPage(PreferencesPage): "For Thunderbird, you can use the Bitmask extension. " "Search for \"Bitmask\" in the add-on manager or " "download it from addons.mozilla.org.".format( - thunderbird_extension_url))) + thunderbird_extension_url))) self.ui.mail_client_label.setText(self.tr( "Alternatively, you can manually configure your mail client to " "use Bitmask Email with these options:")) @@ -71,7 +70,6 @@ class PreferencesEmailPage(PreferencesPage): self.setup_connections() - def setup_connections(self): """ connect signals @@ -106,7 +104,7 @@ class PreferencesEmailPage(PreferencesPage): self.ui.message_label.setText( self.tr('You must be logged in to edit email settings.')) else: - self.ui.import_button.setVisible(False) # hide this until working + self.ui.import_button.setVisible(False) # hide this until working self.ui.message_label.setVisible(False) self.ui.email_tabs.setVisible(True) smtp_port = 2013 @@ -128,7 +126,7 @@ class PreferencesEmailPage(PreferencesPage): Set the current user's key details into the gui. """ self.ui.fingerprint_edit.setPlainText( - self._format_fingerprint(details["fingerprint"])) + self._format_fingerprint(details["fingerprint"])) self.ui.expiration_edit.setText(details["expiry_date"]) self.ui.uid_edit.setText(" ".join(details["uids"])) self.ui.public_key_edit.setPlainText(details["key_data"]) @@ -139,8 +137,8 @@ class PreferencesEmailPage(PreferencesPage): produces, wrapped to two lines. """ fp = fingerprint.upper() - fp_list = [fp[i:i+4] for i in range(0, len(fp), 4)] - fp_wrapped = " ".join(fp_list[0:5]) + "\n" + " ".join(fp_list[5:10]) + fp_list = [fp[i:i + 4] for i in range(0, len(fp), 4)] + fp_wrapped = " ".join(fp_list[0:5]) + "\n" + " ".join(fp_list[5:10]) return fp_wrapped def _export_keys(self): @@ -156,8 +154,8 @@ class PreferencesEmailPage(PreferencesPage): if not file_name.endswith('.pem'): file_name += '.pem' self.app.backend.keymanager_export_keys( - username=self.account.address, - filename=file_name) + username=self.account.address, + filename=file_name) else: logger.debug('Export canceled by the user.') @@ -186,9 +184,9 @@ class PreferencesEmailPage(PreferencesPage): "Export canceled.")) def _import_keys(self): - """ - not yet supported - """ + """ + not yet supported + """ def _keymanager_keys_list(self, keys): """ @@ -203,5 +201,7 @@ class PreferencesEmailPage(PreferencesPage): for key in keys: row = self.ui.keys_table.rowCount() self.ui.keys_table.insertRow(row) - self.ui.keys_table.setItem(row, 0, QtGui.QTableWidgetItem(key.address)) - self.ui.keys_table.setItem(row, 1, QtGui.QTableWidgetItem(key.fingerprint)) + self.ui.keys_table.setItem( + row, 0, QtGui.QTableWidgetItem(key.address)) + self.ui.keys_table.setItem( + row, 1, QtGui.QTableWidgetItem(key.fingerprint)) -- cgit v1.2.3 From 9a0568c18ed38558a481d5f6e4be12c68f9870a6 Mon Sep 17 00:00:00 2001 From: Kali Kaneko Date: Tue, 19 Apr 2016 13:14:54 -0400 Subject: [feature] enable webmail from the mail preferences window this box is only visible when the HAS_PIXELATED flag is True, that means we have pixelated-user-agent and pixelated-www in the environment. - Releases: 0.9.2 --- src/leap/bitmask/gui/preferences_email_page.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'src/leap/bitmask/gui/preferences_email_page.py') diff --git a/src/leap/bitmask/gui/preferences_email_page.py b/src/leap/bitmask/gui/preferences_email_page.py index 8211aeb8..b8633f07 100644 --- a/src/leap/bitmask/gui/preferences_email_page.py +++ b/src/leap/bitmask/gui/preferences_email_page.py @@ -18,11 +18,14 @@ Widget for "email" preferences """ from PySide import QtCore, QtGui +from leap.bitmask.config.leapsettings import LeapSettings from leap.bitmask.logs.utils import get_logger from leap.bitmask.gui.ui_preferences_email_page import Ui_PreferencesEmailPage from leap.bitmask.gui.preferences_page import PreferencesPage +from leap.bitmask.pix import HAS_PIXELATED from leap.mail.imap.service.imap import IMAP_PORT + logger = get_logger() @@ -40,6 +43,7 @@ class PreferencesEmailPage(PreferencesPage): :type app: App """ PreferencesPage.__init__(self, parent, account, app) + self.settings = LeapSettings() self.ui = Ui_PreferencesEmailPage() self.ui.setupUi(self) @@ -65,6 +69,16 @@ class PreferencesEmailPage(PreferencesPage): "Alternatively, you can manually configure your mail client to " "use Bitmask Email with these options:")) + self.ui.webmail_label.setText(self.tr( + "This distribution of Bitmask ships an experimental integration " + "of the Pixelated " + "Webmail. It is not stable yet, but you can enable it to help " + "beta-testing it. (Needs restart!)")) + webmail_enabled = self.settings.get_pixelmail_enabled() + self.ui.webmail_checkbox.setChecked(webmail_enabled) + if not HAS_PIXELATED: + self.ui.webmail_box.setVisible(False) + self.ui.keys_table.horizontalHeader().setResizeMode( 0, QtGui.QHeaderView.Stretch) @@ -81,6 +95,7 @@ class PreferencesEmailPage(PreferencesPage): self._keymanager_export_error) self.ui.import_button.clicked.connect(self._import_keys) self.ui.export_button.clicked.connect(self._export_keys) + self.ui.webmail_checkbox.stateChanged.connect(self._toggle_webmail) def teardown_connections(self): """ @@ -205,3 +220,7 @@ class PreferencesEmailPage(PreferencesPage): row, 0, QtGui.QTableWidgetItem(key.address)) self.ui.keys_table.setItem( row, 1, QtGui.QTableWidgetItem(key.fingerprint)) + + def _toggle_webmail(self, state): + value = True if state == QtCore.Qt.Checked else False + self.settings.set_pixelmail_enabled(value) -- cgit v1.2.3 From b6bf547e3a8b96b5fcdba739ed4be74bf040a7ed Mon Sep 17 00:00:00 2001 From: Kali Kaneko Date: Mon, 25 Apr 2016 17:25:36 -0400 Subject: [refactor] move the pixelated panel upwards --- src/leap/bitmask/gui/preferences_email_page.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'src/leap/bitmask/gui/preferences_email_page.py') diff --git a/src/leap/bitmask/gui/preferences_email_page.py b/src/leap/bitmask/gui/preferences_email_page.py index b8633f07..f6d6f036 100644 --- a/src/leap/bitmask/gui/preferences_email_page.py +++ b/src/leap/bitmask/gui/preferences_email_page.py @@ -71,9 +71,10 @@ class PreferencesEmailPage(PreferencesPage): self.ui.webmail_label.setText(self.tr( "This distribution of Bitmask ships an experimental integration " - "of the Pixelated " - "Webmail. It is not stable yet, but you can enable it to help " - "beta-testing it. (Needs restart!)")) + "of Pixelated " + "Mail. Note: at the current state, anyone with access to " + "your device can read your mail without authentication, " + "by opening a browser pointing to http://localhost:9090 ")) webmail_enabled = self.settings.get_pixelmail_enabled() self.ui.webmail_checkbox.setChecked(webmail_enabled) if not HAS_PIXELATED: -- cgit v1.2.3 From 5a1dd49debdcd9a1ce0568217e9411d1e45a3cad Mon Sep 17 00:00:00 2001 From: Ruben Pollan Date: Mon, 25 Apr 2016 20:24:04 -0300 Subject: [bug] represent keys correctly in preference window --- src/leap/bitmask/gui/preferences_email_page.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'src/leap/bitmask/gui/preferences_email_page.py') diff --git a/src/leap/bitmask/gui/preferences_email_page.py b/src/leap/bitmask/gui/preferences_email_page.py index f6d6f036..7186450d 100644 --- a/src/leap/bitmask/gui/preferences_email_page.py +++ b/src/leap/bitmask/gui/preferences_email_page.py @@ -90,6 +90,8 @@ class PreferencesEmailPage(PreferencesPage): connect signals """ self.app.signaler.keymanager_key_details.connect(self._key_details) + self.app.signaler.keymanager_keys_list.connect( + self._keymanager_keys_list) self.app.signaler.keymanager_export_ok.connect( self._keymanager_export_ok) self.app.signaler.keymanager_export_error.connect( @@ -218,9 +220,9 @@ class PreferencesEmailPage(PreferencesPage): row = self.ui.keys_table.rowCount() self.ui.keys_table.insertRow(row) self.ui.keys_table.setItem( - row, 0, QtGui.QTableWidgetItem(key.address)) + row, 0, QtGui.QTableWidgetItem(" ".join(key["uids"]))) self.ui.keys_table.setItem( - row, 1, QtGui.QTableWidgetItem(key.fingerprint)) + row, 1, QtGui.QTableWidgetItem(key["fingerprint"])) def _toggle_webmail(self, state): value = True if state == QtCore.Qt.Checked else False -- cgit v1.2.3 From e7439f48b4279dcda0dc966903840a2affee3353 Mon Sep 17 00:00:00 2001 From: elijah Date: Wed, 11 May 2016 14:45:09 -0700 Subject: [bug] add scrollbars to mail preference panel --- src/leap/bitmask/gui/preferences_email_page.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'src/leap/bitmask/gui/preferences_email_page.py') diff --git a/src/leap/bitmask/gui/preferences_email_page.py b/src/leap/bitmask/gui/preferences_email_page.py index 7186450d..0f44dfee 100644 --- a/src/leap/bitmask/gui/preferences_email_page.py +++ b/src/leap/bitmask/gui/preferences_email_page.py @@ -65,20 +65,16 @@ class PreferencesEmailPage(PreferencesPage): "Search for \"Bitmask\" in the add-on manager or " "download it from addons.mozilla.org.".format( thunderbird_extension_url))) + self.ui.mail_client_label.setText(self.tr( "Alternatively, you can manually configure your mail client to " - "use Bitmask Email with these options:")) + "use Bitmask with these options:")) self.ui.webmail_label.setText(self.tr( - "This distribution of Bitmask ships an experimental integration " - "of Pixelated " - "Mail. Note: at the current state, anyone with access to " - "your device can read your mail without authentication, " - "by opening a browser pointing to http://localhost:9090 ")) - webmail_enabled = self.settings.get_pixelmail_enabled() - self.ui.webmail_checkbox.setChecked(webmail_enabled) - if not HAS_PIXELATED: - self.ui.webmail_box.setVisible(False) + "Bitmask Mail is an integrated mail client based " + "on Pixelated " + "User Agent. If enabled, any user on your device " + "can read your mail by opening http://localhost:9090")) self.ui.keys_table.horizontalHeader().setResizeMode( 0, QtGui.QHeaderView.Stretch) @@ -122,6 +118,10 @@ class PreferencesEmailPage(PreferencesPage): self.ui.message_label.setText( self.tr('You must be logged in to edit email settings.')) else: + webmail_enabled = self.settings.get_pixelmail_enabled() + self.ui.webmail_checkbox.setChecked(webmail_enabled) + if not HAS_PIXELATED: + self.ui.webmail_box.setVisible(False) self.ui.import_button.setVisible(False) # hide this until working self.ui.message_label.setVisible(False) self.ui.email_tabs.setVisible(True) -- cgit v1.2.3 From 6d4c24af969d72331f0177ec302b9d48381683b8 Mon Sep 17 00:00:00 2001 From: Kali Kaneko Date: Wed, 11 May 2016 20:49:31 -0400 Subject: [style] pep8 --- src/leap/bitmask/gui/preferences_email_page.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/leap/bitmask/gui/preferences_email_page.py') diff --git a/src/leap/bitmask/gui/preferences_email_page.py b/src/leap/bitmask/gui/preferences_email_page.py index 0f44dfee..93c77df1 100644 --- a/src/leap/bitmask/gui/preferences_email_page.py +++ b/src/leap/bitmask/gui/preferences_email_page.py @@ -121,7 +121,7 @@ class PreferencesEmailPage(PreferencesPage): webmail_enabled = self.settings.get_pixelmail_enabled() self.ui.webmail_checkbox.setChecked(webmail_enabled) if not HAS_PIXELATED: - self.ui.webmail_box.setVisible(False) + self.ui.webmail_box.setVisible(False) self.ui.import_button.setVisible(False) # hide this until working self.ui.message_label.setVisible(False) self.ui.email_tabs.setVisible(True) -- cgit v1.2.3