From 769f334a3a424612b454061f4dc3937e3e46071f Mon Sep 17 00:00:00 2001
From: Ivan Alejandro
Date: Mon, 11 Aug 2014 17:35:36 -0300
Subject: Do some pep8 fixes.
---
src/leap/bitmask/gui/mainwindow.py | 24 +++++++++++++-----------
1 file changed, 13 insertions(+), 11 deletions(-)
(limited to 'src')
diff --git a/src/leap/bitmask/gui/mainwindow.py b/src/leap/bitmask/gui/mainwindow.py
index 0518350e..c6fd12e1 100644
--- a/src/leap/bitmask/gui/mainwindow.py
+++ b/src/leap/bitmask/gui/mainwindow.py
@@ -1062,17 +1062,19 @@ class MainWindow(QtGui.QMainWindow):
help_url = "{0}
".format(
self.tr("bitmask.net/help"))
- lang = QtCore.QLocale.system().name().replace('_','-')
+ lang = QtCore.QLocale.system().name().replace('_', '-')
thunderbird_extension_url = \
"https://addons.mozilla.org/{0}/" \
"thunderbird/addon/bitmask/".format(lang)
email_quick_reference = self.tr("Email quick reference")
- thunderbird_text = self.tr("For Thunderbird, you can use the "
+ thunderbird_text = 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))
- manual_text = self.tr("Alternately, you can manually configure "
+ manual_text = self.tr(
+ "Alternately, you can manually configure "
"your mail client to use Bitmask Email with these options:")
manual_imap = self.tr("IMAP: localhost, port {0}".format(IMAP_PORT))
manual_smtp = self.tr("SMTP: localhost, port {0}".format(smtp_port))
@@ -1089,8 +1091,8 @@ class MainWindow(QtGui.QMainWindow):
" {5}"
" {6}"
"
").format(email_quick_reference, thunderbird_text,
- manual_text, manual_imap, manual_smtp,
- manual_username, manual_password)
+ manual_text, manual_imap, manual_smtp,
+ manual_username, manual_password)
QtGui.QMessageBox.about(self, self.tr("Bitmask Help"), msg)
def _needs_update(self):
@@ -1201,7 +1203,8 @@ class MainWindow(QtGui.QMainWindow):
eip_sigs = self._eip_conductor.qtsigs
eip_sigs.connected_signal.connect(self._download_provider_config)
eip_sigs.disconnected_signal.connect(self._download_provider_config)
- eip_sigs.connection_aborted_signal.connect(self._download_provider_config)
+ eip_sigs.connection_aborted_signal.connect(
+ self._download_provider_config)
eip_sigs.connection_died_signal.connect(self._download_provider_config)
def _disconnect_scheduled_login(self):
@@ -1211,18 +1214,17 @@ class MainWindow(QtGui.QMainWindow):
try:
eip_sigs = self._eip_conductor.qtsigs
eip_sigs.connected_signal.disconnect(
- self._download_provider_config)
+ self._download_provider_config)
eip_sigs.disconnected_signal.disconnect(
- self._download_provider_config)
+ self._download_provider_config)
eip_sigs.connection_aborted_signal.disconnect(
- self._download_provider_config)
+ self._download_provider_config)
eip_sigs.connection_died_signal.disconnect(
- self._download_provider_config)
+ self._download_provider_config)
except Exception:
# signal not connected
pass
-
@QtCore.Slot()
def _login(self):
"""
--
cgit v1.2.3
From 1d8fd48517a44f81d816eba2488e23fe3080f83b Mon Sep 17 00:00:00 2001
From: Ivan Alejandro
Date: Mon, 11 Aug 2014 15:48:54 -0300
Subject: Stop the services if the selected provider is changed.
Store the last 2 indexes on a deque and improve the 'select previous
provider' action.
---
src/leap/bitmask/gui/login.py | 46 +++++++++++++++++++---------
src/leap/bitmask/gui/mainwindow.py | 62 ++++++++++++++++++++++++++++++++++++--
2 files changed, 90 insertions(+), 18 deletions(-)
(limited to 'src')
diff --git a/src/leap/bitmask/gui/login.py b/src/leap/bitmask/gui/login.py
index 8e0a3a15..0e64bbcf 100644
--- a/src/leap/bitmask/gui/login.py
+++ b/src/leap/bitmask/gui/login.py
@@ -19,6 +19,8 @@ Login widget implementation
"""
import logging
+from collections import deque
+
from PySide import QtCore, QtGui
from ui_login import Ui_LoginWidget
@@ -43,9 +45,10 @@ class LoginWidget(QtGui.QWidget):
cancel_login = QtCore.Signal()
logout = QtCore.Signal()
- # Emitted when the user selects "Other..." in the provider
- # combobox or click "Create Account"
- show_wizard = QtCore.Signal()
+ # Emitted when the user changes the provider combobox index. The object
+ # parameter is actually a boolean value that is True if "Other..." was
+ # selected, False otherwse
+ provider_changed = QtCore.Signal(object)
MAX_STATUS_WIDTH = 40
@@ -64,7 +67,9 @@ class LoginWidget(QtGui.QWidget):
QtGui.QWidget.__init__(self, parent)
self._settings = settings
- self._selected_provider_index = -1
+
+ self._providers_indexes = deque(maxlen=2) # previous and current
+ self._providers_indexes.append(-1)
self.ui = Ui_LoginWidget()
self.ui.setupUi(self)
@@ -132,7 +137,14 @@ class LoginWidget(QtGui.QWidget):
:type name: str
"""
provider_index = self.ui.cmbProviders.findText(name)
+ self._providers_indexes.append(provider_index)
+
+ # block the signals during a combobox change since we don't want to
+ # trigger the default signal that makes the UI ask the user for
+ # confirmation
+ self.ui.cmbProviders.blockSignals(True)
self.ui.cmbProviders.setCurrentIndex(provider_index)
+ self.ui.cmbProviders.blockSignals(False)
def get_selected_provider(self):
"""
@@ -267,17 +279,21 @@ class LoginWidget(QtGui.QWidget):
:param idx: the index of the new selected item
:type idx: int
"""
- if idx == (self.ui.cmbProviders.count() - 1):
- self.show_wizard.emit()
- # Leave the previously selected provider in the combobox
- prev_provider = 0
- if self._selected_provider_index != -1:
- prev_provider = self._selected_provider_index
- self.ui.cmbProviders.blockSignals(True)
- self.ui.cmbProviders.setCurrentIndex(prev_provider)
- self.ui.cmbProviders.blockSignals(False)
- else:
- self._selected_provider_index = idx
+ self._providers_indexes.append(idx)
+ is_wizard = idx == (self.ui.cmbProviders.count() - 1)
+ self.provider_changed.emit(is_wizard)
+ if is_wizard:
+ self.restore_previous_provider()
+
+ def restore_previous_provider(self):
+ """
+ Set as selected provider the one that was selected previously.
+ """
+ prev_provider = self._providers_indexes.popleft()
+ self._providers_indexes.append(prev_provider)
+ self.ui.cmbProviders.blockSignals(True)
+ self.ui.cmbProviders.setCurrentIndex(prev_provider)
+ self.ui.cmbProviders.blockSignals(False)
def start_login(self):
"""
diff --git a/src/leap/bitmask/gui/mainwindow.py b/src/leap/bitmask/gui/mainwindow.py
index c6fd12e1..a85cb657 100644
--- a/src/leap/bitmask/gui/mainwindow.py
+++ b/src/leap/bitmask/gui/mainwindow.py
@@ -153,8 +153,8 @@ class MainWindow(QtGui.QMainWindow):
self._login_widget.login.connect(self._login)
self._login_widget.cancel_login.connect(self._cancel_login)
- self._login_widget.show_wizard.connect(self._launch_wizard)
self._login_widget.logout.connect(self._logout)
+ self._login_widget.provider_changed.connect(self._on_provider_changed)
# EIP Control redux #########################################
self._eip_conductor = eip_conductor.EIPConductor(
@@ -174,6 +174,8 @@ class MainWindow(QtGui.QMainWindow):
self._eip_conductor.connect_signals()
self._eip_conductor.qtsigs.connected_signal.connect(
self._on_eip_connection_connected)
+ self._eip_conductor.qtsigs.disconnected_signal.connect(
+ self._on_eip_connection_disconnected)
self._eip_conductor.qtsigs.connected_signal.connect(
self._maybe_run_soledad_setup_checks)
@@ -187,7 +189,6 @@ class MainWindow(QtGui.QMainWindow):
self._already_started_eip = False
self._trying_to_start_eip = False
- self._already_started_eip = False
self._soledad_started = False
# This is created once we have a valid provider config
@@ -502,7 +503,6 @@ class MainWindow(QtGui.QMainWindow):
def _launch_wizard(self):
"""
TRIGGERS:
- self._login_widget.show_wizard
self.ui.action_wizard.triggered
Also called in first run.
@@ -1225,6 +1225,52 @@ class MainWindow(QtGui.QMainWindow):
# signal not connected
pass
+ @QtCore.Slot(object)
+ def _on_provider_changed(self, wizard):
+ """
+ TRIGGERS:
+ self._login.provider_changed
+
+ Ask the user if really wants to change provider since a services stop
+ is required for that action.
+
+ :param wizard: whether the 'other...' option was picked or not.
+ :type wizard: bool
+ """
+ # TODO: we should handle the case that EIP is autostarting since we
+ # won't get a warning until EIP has fully started.
+ # TODO: we need to add a check for the mail status (smtp/imap/soledad)
+ something_runing = (self._logged_user is not None or
+ self._already_started_eip)
+ if not something_runing:
+ if wizard:
+ self._launch_wizard()
+ return
+
+ title = self.tr("Stop services")
+ text = self.tr("Do you want to stop all services?")
+ informative_text = self.tr("In order to change the provider, the "
+ "running services needs to be stopped.")
+
+ msg = QtGui.QMessageBox(self)
+ msg.setWindowTitle(title)
+ msg.setText(text)
+ msg.setInformativeText(informative_text)
+ msg.setStandardButtons(QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)
+ msg.setDefaultButton(QtGui.QMessageBox.No)
+ msg.setIcon(QtGui.QMessageBox.Warning)
+ res = msg.exec_()
+
+ if res == QtGui.QMessageBox.Yes:
+ self._stop_services()
+ self._eip_conductor.qtsigs.do_disconnect_signal.emit()
+ if wizard:
+ self._launch_wizard()
+ else:
+ if not wizard:
+ # if wizard, the widget restores itself
+ self._login_widget.restore_previous_provider()
+
@QtCore.Slot()
def _login(self):
"""
@@ -1563,6 +1609,16 @@ class MainWindow(QtGui.QMainWindow):
# check for connectivity
self._backend.eip_check_dns(domain=domain)
+ @QtCore.Slot()
+ def _on_eip_connection_disconnected(self):
+ """
+ TRIGGERS:
+ self._eip_conductor.qtsigs.disconnected_signal
+
+ Set the eip status to not started.
+ """
+ self._already_started_eip = False
+
@QtCore.Slot()
def _set_eip_provider(self, country_code=None):
"""
--
cgit v1.2.3
From dd2097d27efc32820a25faff9236d091372f7930 Mon Sep 17 00:00:00 2001
From: Ivan Alejandro
Date: Tue, 12 Aug 2014 17:12:11 -0300
Subject: Ask for services stop when the wizard is needed.
---
src/leap/bitmask/gui/mainwindow.py | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
(limited to 'src')
diff --git a/src/leap/bitmask/gui/mainwindow.py b/src/leap/bitmask/gui/mainwindow.py
index a85cb657..03f91996 100644
--- a/src/leap/bitmask/gui/mainwindow.py
+++ b/src/leap/bitmask/gui/mainwindow.py
@@ -215,8 +215,9 @@ class MainWindow(QtGui.QMainWindow):
self.ui.action_wizard.triggered.connect(self._launch_wizard)
self.ui.action_show_logs.triggered.connect(self._show_logger_window)
self.ui.action_help.triggered.connect(self._help)
+
self.ui.action_create_new_account.triggered.connect(
- self._launch_wizard)
+ self._on_provider_changed)
self.ui.action_advanced_key_management.triggered.connect(
self._show_AKM)
@@ -1226,10 +1227,11 @@ class MainWindow(QtGui.QMainWindow):
pass
@QtCore.Slot(object)
- def _on_provider_changed(self, wizard):
+ def _on_provider_changed(self, wizard=True):
"""
TRIGGERS:
self._login.provider_changed
+ self.ui.action_create_new_account.triggered
Ask the user if really wants to change provider since a services stop
is required for that action.
@@ -1251,6 +1253,9 @@ class MainWindow(QtGui.QMainWindow):
text = self.tr("Do you want to stop all services?")
informative_text = self.tr("In order to change the provider, the "
"running services needs to be stopped.")
+ if wizard:
+ informative_text = self.tr("In order to start the wizard, the "
+ "running services needs to be stopped.")
msg = QtGui.QMessageBox(self)
msg.setWindowTitle(title)
--
cgit v1.2.3
From e35b7f006b6cb076ff6b982a2f173ab5bc3a41d3 Mon Sep 17 00:00:00 2001
From: Ivan Alejandro
Date: Wed, 13 Aug 2014 17:14:10 -0300
Subject: Use same user/password restrictions as in the webapp.
- no uppercase allowed in usernames,
- password length min to 8
Closes #5894.
---
src/leap/bitmask/util/credentials.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
(limited to 'src')
diff --git a/src/leap/bitmask/util/credentials.py b/src/leap/bitmask/util/credentials.py
index 07ded17b..757ce10c 100644
--- a/src/leap/bitmask/util/credentials.py
+++ b/src/leap/bitmask/util/credentials.py
@@ -21,7 +21,7 @@ Credentials utilities
from PySide import QtCore, QtGui
WEAK_PASSWORDS = ("123456", "qweasd", "qwerty", "password")
-USERNAME_REGEX = r"^[A-Za-z][A-Za-z\d_\-\.]+[A-Za-z\d]$"
+USERNAME_REGEX = r"^[a-z][a-z\d_\-\.]+[a-z\d]$"
USERNAME_VALIDATOR = QtGui.QRegExpValidator(QtCore.QRegExp(USERNAME_REGEX))
@@ -69,7 +69,7 @@ def password_checks(username, password, password2):
if message is None and not password:
message = _tr("You can't use an empty password")
- if message is None and len(password) < 6:
+ if message is None and len(password) < 8:
message = _tr("Password too short")
if message is None and password in WEAK_PASSWORDS:
--
cgit v1.2.3
From 919f29542ff7f2efd9cdd6232fee0eb395fa4f9c Mon Sep 17 00:00:00 2001
From: Ivan Alejandro
Date: Thu, 14 Aug 2014 13:23:58 -0300
Subject: Default to No if ESC pressed on 'install helper files'.
Closes #5819.
---
src/leap/bitmask/platform_init/initializers.py | 1 +
1 file changed, 1 insertion(+)
(limited to 'src')
diff --git a/src/leap/bitmask/platform_init/initializers.py b/src/leap/bitmask/platform_init/initializers.py
index e4d6f9b3..f56b9330 100644
--- a/src/leap/bitmask/platform_init/initializers.py
+++ b/src/leap/bitmask/platform_init/initializers.py
@@ -106,6 +106,7 @@ def get_missing_helpers_dialog():
msg.setStandardButtons(QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)
msg.addButton("No, don't ask again", QtGui.QMessageBox.RejectRole)
msg.setDefaultButton(QtGui.QMessageBox.Yes)
+ msg.setEscapeButton(QtGui.QMessageBox.No)
return msg
--
cgit v1.2.3
From 9a7df988191e2cdeb2e01fb30da55a0c5f4651f9 Mon Sep 17 00:00:00 2001
From: elijah
Date: Wed, 13 Aug 2014 16:20:49 -0700
Subject: moved provider selection popup menu to be at the top of the main
window
---
src/leap/bitmask/gui/login.py | 91 +++------------------------
src/leap/bitmask/gui/mainwindow.py | 76 +++++++++++------------
src/leap/bitmask/gui/providers.py | 114 ++++++++++++++++++++++++++++++++++
src/leap/bitmask/gui/ui/login.ui | 25 ++------
src/leap/bitmask/gui/ui/mainwindow.ui | 39 ++++--------
5 files changed, 177 insertions(+), 168 deletions(-)
create mode 100644 src/leap/bitmask/gui/providers.py
(limited to 'src')
diff --git a/src/leap/bitmask/gui/login.py b/src/leap/bitmask/gui/login.py
index 0e64bbcf..2a79fafd 100644
--- a/src/leap/bitmask/gui/login.py
+++ b/src/leap/bitmask/gui/login.py
@@ -19,8 +19,6 @@ Login widget implementation
"""
import logging
-from collections import deque
-
from PySide import QtCore, QtGui
from ui_login import Ui_LoginWidget
@@ -45,11 +43,6 @@ class LoginWidget(QtGui.QWidget):
cancel_login = QtCore.Signal()
logout = QtCore.Signal()
- # Emitted when the user changes the provider combobox index. The object
- # parameter is actually a boolean value that is True if "Other..." was
- # selected, False otherwse
- provider_changed = QtCore.Signal(object)
-
MAX_STATUS_WIDTH = 40
# Keyring
@@ -68,9 +61,6 @@ class LoginWidget(QtGui.QWidget):
self._settings = settings
- self._providers_indexes = deque(maxlen=2) # previous and current
- self._providers_indexes.append(-1)
-
self.ui = Ui_LoginWidget()
self.ui.setupUi(self)
@@ -85,9 +75,6 @@ class LoginWidget(QtGui.QWidget):
self.ui.lnUser.returnPressed.connect(self._focus_password)
- self.ui.cmbProviders.currentIndexChanged.connect(
- self._current_provider_changed)
-
self.ui.btnLogout.clicked.connect(
self.logout)
@@ -116,42 +103,6 @@ class LoginWidget(QtGui.QWidget):
enable = True if state == QtCore.Qt.Checked else False
self._settings.set_remember(enable)
- def set_providers(self, provider_list):
- """
- Set the provider list to provider_list plus an "Other..." item
- that triggers the wizard
-
- :param provider_list: list of providers
- :type provider_list: list of str
- """
- self.ui.cmbProviders.blockSignals(True)
- self.ui.cmbProviders.clear()
- self.ui.cmbProviders.addItems(provider_list + [self.tr("Other...")])
- self.ui.cmbProviders.blockSignals(False)
-
- def select_provider_by_name(self, name):
- """
- Given a provider name/domain, it selects it in the combobox
-
- :param name: name or domain for the provider
- :type name: str
- """
- provider_index = self.ui.cmbProviders.findText(name)
- self._providers_indexes.append(provider_index)
-
- # block the signals during a combobox change since we don't want to
- # trigger the default signal that makes the UI ask the user for
- # confirmation
- self.ui.cmbProviders.blockSignals(True)
- self.ui.cmbProviders.setCurrentIndex(provider_index)
- self.ui.cmbProviders.blockSignals(False)
-
- def get_selected_provider(self):
- """
- Returns the selected provider in the combobox
- """
- return self.ui.cmbProviders.currentText()
-
def set_remember(self, value):
"""
Checks the remember user and password checkbox
@@ -229,7 +180,6 @@ class LoginWidget(QtGui.QWidget):
self.ui.lnUser.setEnabled(enabled)
self.ui.lnPassword.setEnabled(enabled)
self.ui.chkRemember.setEnabled(enabled and has_keyring())
- self.ui.cmbProviders.setEnabled(enabled)
self._set_cancel(not enabled)
@@ -270,45 +220,20 @@ class LoginWidget(QtGui.QWidget):
"""
self.ui.lnPassword.setFocus()
- @QtCore.Slot(int)
- def _current_provider_changed(self, idx):
- """
- TRIGGERS:
- self.ui.cmbProviders.currentIndexChanged
-
- :param idx: the index of the new selected item
- :type idx: int
- """
- self._providers_indexes.append(idx)
- is_wizard = idx == (self.ui.cmbProviders.count() - 1)
- self.provider_changed.emit(is_wizard)
- if is_wizard:
- self.restore_previous_provider()
-
- def restore_previous_provider(self):
- """
- Set as selected provider the one that was selected previously.
- """
- prev_provider = self._providers_indexes.popleft()
- self._providers_indexes.append(prev_provider)
- self.ui.cmbProviders.blockSignals(True)
- self.ui.cmbProviders.setCurrentIndex(prev_provider)
- self.ui.cmbProviders.blockSignals(False)
-
- def start_login(self):
+ def start_login(self, provider):
"""
Setups the login widgets for actually performing the login and
performs some basic checks.
+ :param provider: the domain of the current provider
+ :type provider: unicode str
:returns: True if everything's good to go, False otherwise
:rtype: bool
"""
username = self.get_user()
password = self.get_password()
- provider = self.get_selected_provider()
- self._enabled_services = self._settings.get_enabled_services(
- self.get_selected_provider())
+ self._enabled_services = self._settings.get_enabled_services(provider)
if len(provider) == 0:
self.set_status(
@@ -347,14 +272,16 @@ class LoginWidget(QtGui.QWidget):
% (e,))
return True
- def logged_in(self):
+ def logged_in(self, provider):
"""
Sets the widgets to the logged in state
+
+ :param provider: the domain of the current provider
+ :type provider: unicode str
"""
self.ui.login_widget.hide()
self.ui.logged_widget.show()
- self.ui.lblUser.setText(make_address(
- self.get_user(), self.get_selected_provider()))
+ self.ui.lblUser.setText(make_address(self.get_user(), provider))
if flags.OFFLINE is False:
self.logged_in_signal.emit()
diff --git a/src/leap/bitmask/gui/mainwindow.py b/src/leap/bitmask/gui/mainwindow.py
index 03f91996..8ce7f2fc 100644
--- a/src/leap/bitmask/gui/mainwindow.py
+++ b/src/leap/bitmask/gui/mainwindow.py
@@ -45,6 +45,7 @@ from leap.bitmask.gui.mail_status import MailStatusWidget
from leap.bitmask.gui.preferenceswindow import PreferencesWindow
from leap.bitmask.gui.systray import SysTray
from leap.bitmask.gui.wizard import Wizard
+from leap.bitmask.gui.providers import Providers
from leap.bitmask.platform_init import IS_WIN, IS_MAC, IS_LINUX
from leap.bitmask.platform_init.initializers import init_platform
@@ -148,13 +149,17 @@ class MainWindow(QtGui.QMainWindow):
self._mail_status = MailStatusWidget(self)
self.ui.mailLayout.addWidget(self._mail_status)
+ # Provider List
+ self._providers = Providers(self.ui.cmbProviders)
+
# Qt Signal Connections #####################################
# TODO separate logic from ui signals.
self._login_widget.login.connect(self._login)
self._login_widget.cancel_login.connect(self._cancel_login)
self._login_widget.logout.connect(self._logout)
- self._login_widget.provider_changed.connect(self._on_provider_changed)
+
+ self._providers.connect_provider_changed(self._on_provider_changed)
# EIP Control redux #########################################
self._eip_conductor = eip_conductor.EIPConductor(
@@ -577,7 +582,7 @@ class MainWindow(QtGui.QMainWindow):
Display the Advanced Key Management dialog.
"""
- domain = self._login_widget.get_selected_provider()
+ domain = self._providers.get_selected_provider()
logged_user = "{0}@{1}".format(self._logged_user, domain)
details = self._provider_details
@@ -600,7 +605,7 @@ class MainWindow(QtGui.QMainWindow):
Display the preferences window.
"""
user = self._logged_user
- domain = self._login_widget.get_selected_provider()
+ domain = self._providers.get_selected_provider()
mx_provided = False
if self._provider_details is not None:
mx_provided = MX_SERVICE in self._provider_details['services']
@@ -717,7 +722,7 @@ class MainWindow(QtGui.QMainWindow):
Display the EIP preferences window.
"""
- domain = self._login_widget.get_selected_provider()
+ domain = self._providers.get_selected_provider()
pref = EIPPreferencesWindow(self, domain,
self._backend, self._leap_signaler)
pref.show()
@@ -794,7 +799,7 @@ class MainWindow(QtGui.QMainWindow):
# XXX: May be this can be divided into two methods?
providers = self._settings.get_configured_providers()
- self._login_widget.set_providers(providers)
+ self._providers.set_providers(providers)
self._show_systray()
if not self._start_hidden:
@@ -810,12 +815,12 @@ class MainWindow(QtGui.QMainWindow):
# select the configured provider in the combo box
domain = self._wizard.get_domain()
- self._login_widget.select_provider_by_name(domain)
+ self._providers.select_provider_by_name(domain)
self._login_widget.set_remember(self._wizard.get_remember())
self._enabled_services = list(self._wizard.get_services())
self._settings.set_enabled_services(
- self._login_widget.get_selected_provider(),
+ self._providers.get_selected_provider(),
self._enabled_services)
if possible_username is not None:
self._login_widget.set_user(possible_username)
@@ -832,7 +837,7 @@ class MainWindow(QtGui.QMainWindow):
domain = self._settings.get_provider()
if domain is not None:
- self._login_widget.select_provider_by_name(domain)
+ self._providers.select_provider_by_name(domain)
if not self._settings.get_remember():
# nothing to do here
@@ -895,11 +900,7 @@ class MainWindow(QtGui.QMainWindow):
"""
Set the login label to reflect offline status.
"""
- provider = ""
- if not self._logged_in_offline:
- provider = self.ui.lblLoginProvider.text()
-
- self.ui.lblLoginProvider.setText(provider + self.tr(" (offline mode)"))
+ # TODO: figure out what widget to use for this. Maybe the window title?
#
# systray
@@ -1159,7 +1160,7 @@ class MainWindow(QtGui.QMainWindow):
emit the corresponding signals inmediately
"""
self._disconnect_scheduled_login()
- domain = self._login_widget.get_selected_provider()
+ domain = self._providers.get_selected_provider()
self._backend.provider_setup(provider=domain)
@QtCore.Slot(dict)
@@ -1176,7 +1177,7 @@ class MainWindow(QtGui.QMainWindow):
:type data: dict
"""
if data[PASSED_KEY]:
- selected_provider = self._login_widget.get_selected_provider()
+ selected_provider = self._providers.get_selected_provider()
self._backend.provider_bootstrap(provider=selected_provider)
else:
logger.error(data[ERROR_KEY])
@@ -1230,7 +1231,7 @@ class MainWindow(QtGui.QMainWindow):
def _on_provider_changed(self, wizard=True):
"""
TRIGGERS:
- self._login.provider_changed
+ self._providers._provider_changed
self.ui.action_create_new_account.triggered
Ask the user if really wants to change provider since a services stop
@@ -1250,12 +1251,9 @@ class MainWindow(QtGui.QMainWindow):
return
title = self.tr("Stop services")
- text = self.tr("Do you want to stop all services?")
+ text = "" + self.tr("Do you want to stop all services?") + ""
informative_text = self.tr("In order to change the provider, the "
"running services needs to be stopped.")
- if wizard:
- informative_text = self.tr("In order to start the wizard, the "
- "running services needs to be stopped.")
msg = QtGui.QMessageBox(self)
msg.setWindowTitle(title)
@@ -1274,7 +1272,7 @@ class MainWindow(QtGui.QMainWindow):
else:
if not wizard:
# if wizard, the widget restores itself
- self._login_widget.restore_previous_provider()
+ self._providers.restore_previous_provider()
@QtCore.Slot()
def _login(self):
@@ -1288,19 +1286,18 @@ class MainWindow(QtGui.QMainWindow):
bootstrapping the EIP service
"""
# TODO most of this could ve handled by the login widget,
- # but we'd have to move lblLoginProvider into the widget itself,
- # instead of having it as a top-level attribute.
+ provider = self._providers.get_selected_provider()
if flags.OFFLINE is True:
logger.debug("OFFLINE mode! bypassing remote login")
# TODO reminder, we're not handling logout for offline
# mode.
- self._login_widget.logged_in()
+ self._login_widget.logged_in(provider)
self._logged_in_offline = True
self._set_label_offline()
self.offline_mode_bypass_login.emit()
else:
self.ui.action_create_new_account.setEnabled(False)
- if self._login_widget.start_login():
+ if self._login_widget.start_login(provider):
if self._trying_to_start_eip:
self._schedule_login()
else:
@@ -1380,7 +1377,7 @@ class MainWindow(QtGui.QMainWindow):
self._show_hide_unsupported_services()
- domain = self._login_widget.get_selected_provider()
+ domain = self._providers.get_selected_provider()
self._backend.user_login(provider=domain,
username=username, password=password)
else:
@@ -1400,7 +1397,7 @@ class MainWindow(QtGui.QMainWindow):
self._logged_user = self._login_widget.get_user()
user = self._logged_user
- domain = self._login_widget.get_selected_provider()
+ domain = self._providers.get_selected_provider()
full_user_id = make_address(user, domain)
self._mail_conductor.userid = full_user_id
self._start_eip_bootstrap()
@@ -1423,9 +1420,8 @@ class MainWindow(QtGui.QMainWindow):
triggers the eip bootstrapping.
"""
- self._login_widget.logged_in()
- domain = self._login_widget.get_selected_provider()
- self.ui.lblLoginProvider.setText(domain)
+ domain = self._providers.get_selected_provider()
+ self._login_widget.logged_in(domain)
self._enabled_services = self._settings.get_enabled_services(domain)
@@ -1447,7 +1443,7 @@ class MainWindow(QtGui.QMainWindow):
and enabled.
This is triggered right after the provider has been set up.
"""
- domain = self._login_widget.get_selected_provider()
+ domain = self._providers.get_selected_provider()
lang = QtCore.QLocale.system().name()
self._backend.provider_get_details(domain=domain, lang=lang)
@@ -1468,7 +1464,7 @@ class MainWindow(QtGui.QMainWindow):
:returns: True if provides and is enabled, False otherwise
:rtype: bool
"""
- domain = self._login_widget.get_selected_provider()
+ domain = self._providers.get_selected_provider()
enabled_services = self._settings.get_enabled_services(domain)
mx_enabled = MX_SERVICE in enabled_services
@@ -1485,7 +1481,7 @@ class MainWindow(QtGui.QMainWindow):
:returns: True if provides and is enabled, False otherwise
:rtype: bool
"""
- domain = self._login_widget.get_selected_provider()
+ domain = self._providers.get_selected_provider()
enabled_services = self._settings.get_enabled_services(domain)
eip_enabled = EIP_SERVICE in enabled_services
@@ -1506,7 +1502,7 @@ class MainWindow(QtGui.QMainWindow):
username = self._login_widget.get_user()
password = unicode(self._login_widget.get_password())
- provider_domain = self._login_widget.get_selected_provider()
+ provider_domain = self._providers.get_selected_provider()
if flags.OFFLINE:
full_user_id = make_address(username, provider_domain)
@@ -1522,7 +1518,7 @@ class MainWindow(QtGui.QMainWindow):
password=password, uuid=uuid)
else:
if self._logged_user is not None:
- domain = self._login_widget.get_selected_provider()
+ domain = self._providers.get_selected_provider()
self._backend.soledad_bootstrap(username=username,
domain=domain,
password=password)
@@ -1606,7 +1602,7 @@ class MainWindow(QtGui.QMainWindow):
"""
self._already_started_eip = True
- domain = self._login_widget.get_selected_provider()
+ domain = self._providers.get_selected_provider()
self._settings.set_defaultprovider(domain)
self._backend.eip_get_gateway_country_code(domain=domain)
@@ -1633,7 +1629,7 @@ class MainWindow(QtGui.QMainWindow):
Set the current provider and country code in the eip status widget.
"""
- domain = self._login_widget.get_selected_provider()
+ domain = self._providers.get_selected_provider()
self._eip_status.set_provider(domain, country_code)
@QtCore.Slot()
@@ -1641,7 +1637,7 @@ class MainWindow(QtGui.QMainWindow):
"""
Trigger this if we don't have a working DNS resolver.
"""
- domain = self._login_widget.get_selected_provider()
+ domain = self._providers.get_selected_provider()
msg = self.tr(
"The server at {0} can't be found, because the DNS lookup "
"failed. DNS is the network service that translates a "
@@ -1705,7 +1701,7 @@ class MainWindow(QtGui.QMainWindow):
self._eip_status.eip_button.hide()
self._eip_status.eip_button.setEnabled(False)
- domain = self._login_widget.get_selected_provider()
+ domain = self._providers.get_selected_provider()
self._backend.eip_setup(provider=domain)
self._already_started_eip = True
@@ -1796,7 +1792,6 @@ class MainWindow(QtGui.QMainWindow):
Inform the user about a logout error.
"""
self._login_widget.done_logout()
- self.ui.lblLoginProvider.setText(self.tr("Login"))
self._login_widget.set_status(
self.tr("Something went wrong with the logout."))
@@ -1810,7 +1805,6 @@ class MainWindow(QtGui.QMainWindow):
logging out
"""
self._login_widget.done_logout()
- self.ui.lblLoginProvider.setText(self.tr("Login"))
self._logged_user = None
self._login_widget.logged_out()
diff --git a/src/leap/bitmask/gui/providers.py b/src/leap/bitmask/gui/providers.py
new file mode 100644
index 00000000..b3eb8620
--- /dev/null
+++ b/src/leap/bitmask/gui/providers.py
@@ -0,0 +1,114 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2013,2014 LEAP
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+
+"""
+An instance of class Providers, held by mainwindow, is responsible for
+managing the current provider and the combobox provider list.
+"""
+
+from collections import deque
+from PySide import QtCore
+
+
+class Providers(QtCore.QObject):
+
+ # Emitted when the user changes the provider combobox index. The object
+ # parameter is actually a boolean value that is True if "Other..." was
+ # selected, False otherwse
+ _provider_changed = QtCore.Signal(object)
+
+ def __init__(self, providers_combo):
+ """
+ :param providers_combo: combo widget that lists providers
+ :type providers_combo: QWidget
+ """
+ QtCore.QObject.__init__(self)
+ self._providers_indexes = deque(maxlen=2) # previous and current
+ self._providers_indexes.append(-1)
+ self._combo = providers_combo
+ self._combo.currentIndexChanged.connect(
+ self._current_provider_changed)
+
+ def set_providers(self, provider_list):
+ """
+ Set the provider list to provider_list plus an "Other..." item
+ that triggers the wizard
+
+ :param provider_list: list of providers
+ :type provider_list: list of str
+ """
+ self._combo.blockSignals(True)
+ self._combo.clear()
+ self._combo.addItems(provider_list + [self.tr("Other...")])
+ self._combo.blockSignals(False)
+
+ def select_provider_by_name(self, name):
+ """
+ Given a provider name/domain, it selects it in the combobox
+
+ :param name: name or domain for the provider
+ :type name: unicode str
+ """
+ provider_index = self._combo.findText(name)
+ self._providers_indexes.append(provider_index)
+
+ # block the signals during a combobox change since we don't want to
+ # trigger the default signal that makes the UI ask the user for
+ # confirmation
+ self._combo.blockSignals(True)
+ self._combo.setCurrentIndex(provider_index)
+ self._combo.blockSignals(False)
+
+ def get_selected_provider(self):
+ """
+ Returns the selected provider in the combobox
+
+ :rtype: unicode str
+ """
+ return self._combo.currentText()
+
+ def connect_provider_changed(self, callback):
+ """
+ Connects callback to provider_changed signal
+ """
+ self._provider_changed.connect(callback)
+
+ def restore_previous_provider(self):
+ """
+ Set as selected provider the one that was selected previously.
+ """
+ prev_provider = self._providers_indexes.popleft()
+ self._providers_indexes.append(prev_provider)
+ self._combo.blockSignals(True)
+ self._combo.setCurrentIndex(prev_provider)
+ self._combo.blockSignals(False)
+
+ @QtCore.Slot(int)
+ def _current_provider_changed(self, idx):
+ """
+ TRIGGERS:
+ self._combo.currentIndexChanged
+
+ :param idx: the index of the new selected item
+ :type idx: int
+ """
+ self._providers_indexes.append(idx)
+ is_wizard = idx == (self._combo.count() - 1)
+ self._provider_changed.emit(is_wizard)
+ if is_wizard:
+ self.restore_previous_provider()
diff --git a/src/leap/bitmask/gui/ui/login.ui b/src/leap/bitmask/gui/ui/login.ui
index 26decc6d..bfd5f9c0 100644
--- a/src/leap/bitmask/gui/ui/login.ui
+++ b/src/leap/bitmask/gui/ui/login.ui
@@ -69,17 +69,7 @@
24
- -
-
-
- <b>Provider:</b>
-
-
- Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
-
-
- -
+
-
@@ -92,7 +82,7 @@
- -
+
-
-
@@ -116,10 +106,7 @@
- -
-
-
- -
+
-
<b>Username:</b>
@@ -129,10 +116,10 @@
- -
+
-
- -
+
-
<b>Password:</b>
@@ -142,7 +129,7 @@
- -
+
-
diff --git a/src/leap/bitmask/gui/ui/mainwindow.ui b/src/leap/bitmask/gui/ui/mainwindow.ui
index 5dc48f29..92c13d15 100644
--- a/src/leap/bitmask/gui/ui/mainwindow.ui
+++ b/src/leap/bitmask/gui/ui/mainwindow.ui
@@ -75,7 +75,7 @@
0
0
524
- 589
+ 540
@@ -86,7 +86,7 @@
0
-
-
+
0
@@ -97,29 +97,16 @@
false
- background-color: rgba(0,0,0,20); border-bottom: 1px solid rgba(0,0,0,30);
+ QFrame#providerFrame {background-color: rgba(0,0,0,20); border-bottom: 1px solid rgba(0,0,0,30);}
-
- 24
-
-
- 24
-
-
-
+
- 75
- true
+ 12
-
- background-color: rgba(255, 255, 255, 0); border: none;
-
-
- Please Log In
-
@@ -186,7 +173,7 @@
-
- -1
+ 6
12
@@ -224,18 +211,18 @@
0
-
- false
-
-
- background-color: rgba(0,0,0,20); border-top: 1px solid rgba(0,0,0,30);
-
0
16
+
+ false
+
+
+ background-color: rgba(0,0,0,20); border-top: 1px solid rgba(0,0,0,30);
+
@@ -319,7 +306,7 @@
0
0
524
- 21
+ 25