~mvo/ubuntu-sso-client/strawman-lp711413

« back to all changes in this revision

Viewing changes to ubuntu_sso/credentials.py

  • Committer: Natalia B. Bidart
  • Date: 2012-05-04 19:10:20 UTC
  • mto: This revision was merged to the branch mainline in revision 838.
  • Revision ID: natalia.bidart@canonical.com-20120504191020-vrd0ybx3tmpfn9wx
- Made the service use the Qt UI if available, and if no UI is installed,
propagate a decent error instead of AssertionError (LP: #994632).

Show diffs side-by-side

added added

removed removed

Lines of Context:
49
49
 
50
50
from twisted.internet import defer
51
51
 
52
 
from ubuntu_sso import UI_EXECUTABLE_GTK, USER_CANCELLATION, USER_SUCCESS
 
52
from ubuntu_sso import (
 
53
    UI_EXECUTABLE_GTK,
 
54
    UI_EXECUTABLE_QT,
 
55
    USER_CANCELLATION,
 
56
    USER_SUCCESS,
 
57
)
53
58
from ubuntu_sso.keyring import Keyring
54
59
from ubuntu_sso.logger import setup_logging
55
60
from ubuntu_sso.utils import get_bin_dir, runner
79
84
    """The user is not validated."""
80
85
 
81
86
 
 
87
class GUINotAvailableError(CredentialsError):
 
88
    """No user graphical interface is available."""
 
89
 
 
90
 
82
91
def handle_failures(msg):
83
92
    """Handle failures using 'msg' as error message."""
84
93
 
153
162
 
154
163
    @defer.inlineCallbacks
155
164
    def _show_ui(self, login_only):
156
 
        """Shows the UI, connect outcome signals."""
157
 
        ui_exe_path = os.path.join(get_bin_dir(), self.ui_executable)
158
 
        if not os.path.exists(ui_exe_path):
159
 
            logger.debug('Falling back to the GTK+ UI since the given %r '
160
 
                         'does not exist', ui_exe_path)
161
 
            ui_exe_path = os.path.join(get_bin_dir(), UI_EXECUTABLE_GTK)
162
 
 
163
 
        assert os.path.exists(ui_exe_path)
 
165
        """Show the UI and wait for it to finish.
 
166
 
 
167
        Upon analyzing returning code from the UI process, emit proper signals
 
168
        to the caller.
 
169
 
 
170
        The caller can specify a preference for the UI (so far either GTK+ or
 
171
        Qt UIs are available), but if the preferred one is not available, the
 
172
        service will try to open any available UI.
 
173
 
 
174
        If no GUI is available, GUINotAvailableError will be raised.
 
175
 
 
176
        """
 
177
        guis = (self.ui_executable, UI_EXECUTABLE_GTK, UI_EXECUTABLE_QT)
 
178
        for gui_exe_path in guis:
 
179
            ui_exe_path = os.path.join(get_bin_dir(), gui_exe_path)
 
180
            ui_exe_exists = os.path.exists(ui_exe_path)
 
181
            logger.debug('Attempting to use the following executable as GUI: '
 
182
                '%r (exists? %r).', ui_exe_path, ui_exe_exists)
 
183
            if not ui_exe_exists:
 
184
                logger.error('The given UI path %r does not exist.',
 
185
                    ui_exe_path)
 
186
            else:
 
187
                break
 
188
        else:
 
189
            raise GUINotAvailableError('Can not find a GUI to present to the '
 
190
                'user (tried with %r). Aborting.' % repr(guis))
164
191
 
165
192
        args = [ui_exe_path]
166
193
        for arg in ('app_name', 'help_text', 'ping_url', 'policy_url',