[X2Go-Commits] pyhoca-gui.git - twofactorauth (branch) updated: 462262d97120ce16afdc10c550d5bc4f64078187
X2Go dev team
git-admin at x2go.org
Sat Sep 14 15:54:17 CEST 2013
The branch, twofactorauth has been updated
via 462262d97120ce16afdc10c550d5bc4f64078187 (commit)
from 4dfbdb8a54aad666747e2b5d3d33376da187a9ca (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
-----------------------------------------------------------------------
Summary of changes:
pyhoca/wxgui/frontend.py | 120 ++++++++++++++++++++++++-----------------
pyhoca/wxgui/logon.py | 12 +++--
pyhoca/wxgui/menus_taskbar.py | 16 ++++--
pyhoca/wxgui/taskbar.py | 17 ++++--
4 files changed, 107 insertions(+), 58 deletions(-)
The diff of changes is:
diff --git a/pyhoca/wxgui/frontend.py b/pyhoca/wxgui/frontend.py
index 25012a3..ea4d702 100644
--- a/pyhoca/wxgui/frontend.py
+++ b/pyhoca/wxgui/frontend.py
@@ -93,6 +93,8 @@ class PyHocaGUI(wx.App, x2go.X2goClient):
x2go.X2goClient.__init__(self, logger=self._pyhoca_liblogger)
wx.App.__init__(self)
+ # panel is a generic panel that allows to influence the mouse cursor when it hovers
+ # above the tray icon (and any other element on the desktop we created)
self.Bind(wx.EVT_IDLE, self.OnIdle)
def OnInit(self):
@@ -112,7 +114,7 @@ class PyHocaGUI(wx.App, x2go.X2goClient):
STILL UNDOCUMENTED
"""
- gevent.sleep(.01)
+ gevent.sleep(.02)
evt.RequestMore()
return True
@@ -142,6 +144,7 @@ class PyHocaGUI(wx.App, x2go.X2goClient):
self._sub_windows = []
self._eventid_profilenames_map = {}
self._eventid_sessionnames_map = {}
+ self._temp_disabled_profile_names = []
# We register one session per available session profile.
# These registered sessions will be used to access the profile's
@@ -185,8 +188,12 @@ class PyHocaGUI(wx.App, x2go.X2goClient):
# wx.App's OnExit method
def OnExit(self):
- x2go.x2go_cleanup()
+ """\
+ STILL UNDOCUMENTED
+ """
+ x2go.x2go_cleanup()
+ wx.EndBusyCursor()
# close open password dialogs (or other remaining windows)
for _win in self._sub_windows:
_win.Destroy()
@@ -247,37 +254,49 @@ class PyHocaGUI(wx.App, x2go.X2goClient):
if not _resumed and self.start_on_connect:
self._start_on_connect(evt, session_uuid)
- def OnSessionAuthenticate(self, evt):
- """\
- STILL UNDOCUMENTED
-
- """
- self.current_profile_name = self._eventid_profilenames_map[evt.GetId()]
- session_uuid = self._X2goClient__register_session(profile_name=self.current_profile_name)
-
+ def _do_authenticate(self, evt, session_uuid):
+ profile_name = self.current_profile_name
try:
self._X2goClient__connect_session(session_uuid, add_to_known_hosts=True)
if not self._X2goClient__server_valid_x2gouser(session_uuid):
- self.notifier.send('%s - connect failure' % self.current_profile_name, 'User is not allowed to start X2go sessions!', icon='session_warning', timeout=10000)
+ self.notifier.send('%s - connect failure' % profile_name, 'User is not allowed to start X2go sessions!', icon='session_warning', timeout=10000)
self._X2goClient__disconnect(session_uuid)
+ self._temp_disabled_profile_names.remove(profile_name)
else:
- self.notifier.send('%s - connect' % self.current_profile_name, 'Public SSH key authentication has been successful.', icon='auth_success', timeout=4000)
+ self.notifier.send('%s - connect' % profile_name, 'Public SSH key authentication has been successful.', icon='auth_success', timeout=4000)
_dummy = self._X2goClient__list_sessions(session_uuid, refresh_cache=True)
self._post_authenticate(evt, session_uuid)
+ self._temp_disabled_profile_names.remove(profile_name)
except x2go.AuthenticationException:
self._pyhoca_logger('public SSH key authentication to server failed, trying next auth-mechanism', loglevel=x2go.log.loglevel_INFO, )
- _logon_window = logon.PyHocaGUI_DialogBoxPassword(self, self.current_profile_name, caller=self )
+ _logon_window = logon.PyHocaGUI_DialogBoxPassword(self, profile_name, caller=self )
self._sub_windows.append(_logon_window)
except x2go.SSHException, e:
- self.notifier.send('%s - connect error' % self.current_profile_name, '%s!' % str(e), icon='auth_error', timeout=4000)
+ self.notifier.send('%s - connect error' % profile_name, '%s!' % str(e), icon='auth_error', timeout=4000)
+ self._temp_disabled_profile_names.remove(profile_name)
except gevent.dns.DNSError, e:
- self.notifier.send('%s - connect error' % self.current_profile_name, '%s!' % e.strerror, icon='auth_error', timeout=4000)
+ self.notifier.send('%s - connect error' % profile_name, '%s!' % e.strerror, icon='auth_error', timeout=4000)
+ self._temp_disabled_profile_names.remove(profile_name)
except gevent.socket.error, e:
- self.notifier.send('%s - connect error' % self.current_profile_name, '%s!' % e.strerror, icon='auth_error', timeout=4000)
+ self.notifier.send('%s - connect error' % profile_name, '%s!' % e.strerror, icon='auth_error', timeout=4000)
+ self._temp_disabled_profile_names.remove(profile_name)
except:
- self.notifier.send('%s - connect error' % self.current_profile_name, 'An unknown error occurred!', icon='auth_error', timeout=4000)
+ self.notifier.send('%s - connect error' % profile_name, 'An unknown error occurred during authentication!', icon='auth_error', timeout=4000)
+ self._temp_disabled_profile_names.remove(profile_name)
+ self.taskbar.SetIconIdle()
+ def OnSessionAuthenticate(self, evt):
+ """\
+ STILL UNDOCUMENTED
+
+ """
+ self.current_profile_name = self._eventid_profilenames_map[evt.GetId()]
+ self.taskbar.SetIconConnecting(self.current_profile_name)
+ session_uuid = self._X2goClient__register_session(profile_name=self.current_profile_name)
+ self._temp_disabled_profile_names.append(self.current_profile_name)
+ gevent.spawn(self._do_authenticate, evt, session_uuid)
+
def OnSessionStart(self, evt):
"""\
STILL UNDOCUMENTED
@@ -290,9 +309,6 @@ class PyHocaGUI(wx.App, x2go.X2goClient):
gevent.spawn(self._X2goClient__start_session, session_uuid)
self.notifier.send(self.current_profile_name, 'New X2go session starting up...', icon='session_start', timeout=10000)
_dummy = self._X2goClient__list_sessions(session_uuid, refresh_cache=True)
- else:
- self.notifier.send(self.current_profile_name, 'Paramiko/SSH session has died! Try to re-connect to the server.', icon='session_error', timeout=10000)
-
def OnSessionResume(self, evt):
"""\
@@ -305,13 +321,22 @@ class PyHocaGUI(wx.App, x2go.X2goClient):
session_name = self._eventid_sessionnames_map[evt.GetId()]
if self._X2goClient__server_is_alive(session_uuid):
gevent.spawn(self._X2goClient__resume_session, session_uuid, session_name=session_name)
- self.notifier.send(self.current_profile_name, 'Resuming X2go session...\nSession: %s' % session_name, icon='session_resume', timeout=10000)
+ self.notifier.send(self.current_profile_name, 'Resuming X2go session...\n%s' % session_name, icon='session_resume', timeout=10000)
_dummy = self._X2goClient__list_sessions(session_uuid, refresh_cache=True)
- else:
- self.notifier.send(self.current_profile_name, 'Paramiko/SSH session has died! Try to re-connect to the server.', icon='session_error', timeout=10000)
self._eventid_sessionnames_map = {}
+ def _do_suspend(self, evt, session_uuid, session_name):
+ profile_name = self.current_profile_name
+ self._X2goClient__suspend_session(session_uuid, session_name=session_name)
+ if self._X2goClient__server_is_alive(session_uuid):
+ i=0
+ while not self._X2goClient__is_session_suspended(session_uuid, session_name) and i <= 10:
+ i +=1
+ gevent.sleep(1)
+ self.notifier.send(profile_name, 'X2go session has been suspended...\n%s' % session_name, icon='session_suspend', timeout=8000)
+ _dummy = self._X2goClient__list_sessions(session_uuid, refresh_cache=True)
+
def OnSessionSuspend(self, evt):
"""\
STILL UNDOCUMENTED
@@ -321,15 +346,19 @@ class PyHocaGUI(wx.App, x2go.X2goClient):
_control_session = self._X2goClient__client_registered_sessions_of_name(self.current_profile_name)[0]
session_uuid = _control_session.get_uuid()
session_name = self._eventid_sessionnames_map[evt.GetId()]
- gevent.spawn(self._X2goClient__suspend_session, session_uuid, session_name=session_name)
- gevent.sleep(2)
+ gevent.spawn(self._do_suspend, evt, session_uuid, session_name)
+ self._eventid_sessionnames_map = {}
+
+ def _do_terminate(self, evt, session_uuid, session_name):
+ profile_name = self.current_profile_name
+ self._X2goClient__terminate_session(session_uuid, session_name=session_name)
if self._X2goClient__server_is_alive(session_uuid):
- if self._X2goClient__is_session_suspended(session_uuid, session_name):
- self.notifier.send(self.current_profile_name, 'X2go session has been suspended.\nSession: %s' % session_name, icon='session_suspend', timeout=8000)
+ i=0
+ while not self._X2goClient__has_session_terminated(session_uuid, session_name) and i <= 10:
+ i +=1
+ gevent.sleep(1)
+ self.notifier.send(profile_name, 'X2go session has terminated...\n%s' % session_name, icon='session_suspend', timeout=8000)
_dummy = self._X2goClient__list_sessions(session_uuid, refresh_cache=True)
- else:
- self.notifier.send(self.current_profile_name, 'Paramiko/SSH transport session has died!', icon='session_error', timeout=10000)
- self._eventid_sessionnames_map = {}
def OnSessionTerminate(self, evt):
"""\
@@ -340,15 +369,7 @@ class PyHocaGUI(wx.App, x2go.X2goClient):
_control_session = self._X2goClient__client_registered_sessions_of_name(self.current_profile_name)[0]
session_uuid = _control_session.get_uuid()
session_name = self._eventid_sessionnames_map[evt.GetId()]
- gevent.spawn(self._X2goClient__terminate_session, session_uuid, session_name=session_name)
- gevent.sleep(2)
- if self._X2goClient__server_is_alive(session_uuid):
- if self._X2goClient__has_session_terminated(session_uuid, session_name):
- self.notifier.send(self.current_profile_name, 'X2go session has terminated.\nSession: %s' % session_name, icon='session_terminate', timeout=8000)
- _dummy = self._X2goClient__list_sessions(session_uuid, refresh_cache=True)
- else:
- self.notifier.send(self.current_profile_name, 'Paramiko/SSH session has died! Try to re-connect to the server.', icon='session_error', timeout=10000)
-
+ gevent.spawn(self._do_terminate, evt, session_uuid, session_name)
self._eventid_sessionnames_map = {}
def OnCleanSessions(self, evt):
@@ -364,11 +385,9 @@ class PyHocaGUI(wx.App, x2go.X2goClient):
if session_names:
_notify_text = 'Cleaning X2go sessions...'
for session_name in session_names:
- _notify_text += '\nSession: %s' % session_name
+ _notify_text += '\n%s' % session_name
self.notifier.send(self.current_profile_name, _notify_text, icon='session_cleanall', timeout=10000)
gevent.spawn(self._X2goClient__clean_sessions, session_uuid)
- else:
- self.notifier.send(self.current_profile_name, 'Paramiko/SSH session has died! Try to re-connect to the server.', icon='session_error', timeout=10000)
def OnSessionDisconnect(self, evt):
"""\
@@ -379,16 +398,12 @@ class PyHocaGUI(wx.App, x2go.X2goClient):
_control_session = self._X2goClient__client_registered_sessions_of_name(self.current_profile_name)[0]
session_uuid = _control_session.get_uuid()
- # disconnect control session
+ # disconnect all profile sessions
if self._X2goClient__server_is_alive(session_uuid):
- self._X2goClient__disconnect_session(session_uuid)
+ self._X2goClient__disconnect_profile(profile_name)
gevent.sleep(2)
if not self._X2goClient__is_session_connected(session_uuid):
self.notifier.send('%s - disconnect' % self.current_profile_name, 'X2go Profile is now disconnected.', icon='auth_disconnect', timeout=4000)
- else:
- # do a disconnect anyway...
- self._X2goClient__disconnect_session(session_uuid)
- self.notifier.send(self.current_profile_name, 'Paramiko/SSH session has already died!', icon='session_warning', timeout=10000)
def OnProfileAdd(self, evt):
"""\
@@ -429,3 +444,12 @@ class PyHocaGUI(wx.App, x2go.X2goClient):
"""
self.OnExit(evt)
+
+ ##
+ ## Python X2go (X2goClient) notification HOOK's...
+ ##
+
+ # this hook gets called from Python X2go classes if profile_name's control session has died...
+ def HOOK_on_control_session_death(self, profile_name):
+ self.notifier.send('%s - channel error' % profile_name, 'Lost connection to server %s unexpectedly! Try to re-connect to the server...' % profile_name, icon='session_warning', timeout=10000)
+
diff --git a/pyhoca/wxgui/logon.py b/pyhoca/wxgui/logon.py
index a076849..dd7c366 100644
--- a/pyhoca/wxgui/logon.py
+++ b/pyhoca/wxgui/logon.py
@@ -99,7 +99,7 @@ class PyHocaGUI_DialogBoxPassword(wx.Dialog):
self._PyHocaGUI = _PyHocaGUI
self._pyhoca_logger = self._PyHocaGUI._pyhoca_logger
- self._pyhoca_logger('password dialog box started', x2go.loglevel_INFO, )
+ self._pyhoca_logger('password dialog box started', loglevel=x2go.loglevel_INFO, )
self.current_profile_name = profile_name
self.current_profile_config = self._PyHocaGUI.session_profiles.get_profile_config(profile_name)
@@ -167,6 +167,7 @@ class PyHocaGUI_DialogBoxPassword(wx.Dialog):
session_uuid = self._PyHocaGUI._X2goClient__client_registered_sessions_of_name(self.current_profile_name)[0].get_uuid()
try:
+ wx.BeginBusyCursor()
self._PyHocaGUI._X2goClient__connect_session(session_uuid, username=username, password=password, force_password_auth=True)
print 'TEST: %s' % self._PyHocaGUI._X2goClient__server_valid_x2gouser(session_uuid)
if not self._PyHocaGUI._X2goClient__server_valid_x2gouser(session_uuid):
@@ -201,7 +202,7 @@ class PyHocaGUI_DialogBoxPassword(wx.Dialog):
except:
self._PyHocaGUI.notifier.prepare('AUTH_%s' % self.current_profile_name,
title='%s - connect error' % self.current_profile_name,
- text='An unknown error occured!',
+ text='An unknown error occured during authentication!',
icon='auth_error')
@@ -209,7 +210,8 @@ class PyHocaGUI_DialogBoxPassword(wx.Dialog):
if self._PyHocaGUI._X2goClient__is_session_connected(session_uuid):
_dummy = self._PyHocaGUI.list_sessions(session_uuid, refresh_cache=True)
self._PyHocaGUI._post_authenticate(evt, session_uuid)
-
+ wx.SetCursor(wx.StockCursor(wx.CURSOR_ARROW))
+ wx.EndBusyCursor()
self.Destroy()
def OnCancel(self, evt):
@@ -217,6 +219,10 @@ class PyHocaGUI_DialogBoxPassword(wx.Dialog):
def Destroy(self):
self._PyHocaGUI._sub_windows.remove(self)
+ try:
+ self._PyHocaGUI._temp_disabled_profile_names.remove(self.current_profile_name)
+ except ValueError:
+ pass
wx.Dialog.Destroy(self)
diff --git a/pyhoca/wxgui/menus_taskbar.py b/pyhoca/wxgui/menus_taskbar.py
index 1826b4a..eeb0e44 100644
--- a/pyhoca/wxgui/menus_taskbar.py
+++ b/pyhoca/wxgui/menus_taskbar.py
@@ -161,8 +161,8 @@ class PyHocaGUI_Menu_TaskbarSessionProfile(wx.Menu):
self.Append(id=ID_SESSIONSTART, text="Start &new Session")
- _query_session = self._PyHocaGUI.client_registered_sessions_of_name(profile_name)[0]
- _session_list = self._PyHocaGUI.list_sessions(_query_session.get_uuid())
+ _query_session_uuid = self._PyHocaGUI.client_connected_sessions_of_name(profile_name)[0]
+ _session_list = self._PyHocaGUI.list_sessions(_query_session_uuid)
if _session_list:
@@ -199,7 +199,7 @@ class PyHocaGUI_Menu_TaskbarProfileNames(wx.Menu):
STILL UNDOCUMENTED
"""
- def __init__(self, _PyHocaGUI, caller=None, filter_profiles=None, bind_method=None, submenu=None):
+ def __init__(self, _PyHocaGUI, caller=None, filter_profiles=None, disabled_profiles=None, bind_method=None, submenu=None):
"""\
STILL UNDOCUMENTED
@@ -222,6 +222,16 @@ class PyHocaGUI_Menu_TaskbarProfileNames(wx.Menu):
self.Append(text=profile_name, id=_this_id)
if bind_method is not None:
self.Bind(wx.EVT_MENU, bind_method, id=_this_id)
+ self._PyHocaGUI.Bind(wx.EVT_UPDATE_UI, self.OnUpdateUI, id=_this_id)
+
+ def OnUpdateUI(self, evt):
+ profile_name = self._PyHocaGUI._eventid_profilenames_map[evt.GetId()]
+ if profile_name in self._PyHocaGUI._temp_disabled_profile_names:
+ self._pyhoca_logger('Updating UI, temporarily disabling session profile %s' % profile_name)
+ self.Enable(id=evt.GetId(), enable=False)
+ elif profile_name not in self._PyHocaGUI._temp_disabled_profile_names:
+ self._pyhoca_logger('Updating UI, re-enabling session profile %s' % profile_name)
+ self.Enable(id=evt.GetId(), enable=True)
class PyHocaGUI_Menu_TaskbarSessionManager(wx.Menu):
diff --git a/pyhoca/wxgui/taskbar.py b/pyhoca/wxgui/taskbar.py
index a2e8c9b..36b3024 100644
--- a/pyhoca/wxgui/taskbar.py
+++ b/pyhoca/wxgui/taskbar.py
@@ -79,17 +79,25 @@ class PyHocaGUI_TaskBarIcon(wx.TaskBarIcon):
self._PyHocaGUI = _PyHocaGUI
self._pyhoca_logger = self._PyHocaGUI._pyhoca_logger
self._pyhoca_logger('start TaskBarIcon of type: %s' % (wx.PlatformInfo, ), loglevel=x2go.loglevel_INFO)
- icon = self.MakeIcon(images.getx2goclientImage())
- self.SetIcon(icon, "PyHoca-GUI (Python X2go Client)")
+ self.SetIconIdle()
self.imgidx = 1
self.tooltip = ""
+ def SetIconConnecting(self, profile_name):
+ self.icon = self.MakeIcon(images.getx2goclientImage())
+ self.SetIcon(self.icon, "PyHoca-GUI - connecting to %s..." % profile_name)
+
+ def SetIconIdle(self):
+ self.icon = self.MakeIcon(images.getx2goclientImage())
+ self.SetIcon(self.icon, "PyHoca-GUI (Python X2go Client)")
+
def CreateSessionManagerPopupMenu(self, evt):
"""\
STILL UNDOCUMENTED
"""
- self.PopupMenu(menus_taskbar.PyHocaGUI_Menu_TaskbarSessionManager(self._PyHocaGUI, caller=self))
+ self.menu_sessionmanager = self.PopupMenu(menus_taskbar.PyHocaGUI_Menu_TaskbarSessionManager(self._PyHocaGUI, caller=self))
+ return self.menu_sessionmanager
def CreatePopupMenu(self):
"""\
@@ -101,7 +109,8 @@ class PyHocaGUI_TaskBarIcon(wx.TaskBarIcon):
return self.CreateProfileManagerPopupMenu()
def CreateProfileManagerPopupMenu(self):
- return menus_taskbar.PyHocaGUI_Menu_TaskbarOptionsManager(self._PyHocaGUI, caller=self)
+ self.menu_optionsmanager = menus_taskbar.PyHocaGUI_Menu_TaskbarOptionsManager(self._PyHocaGUI, caller=self)
+ return self.menu_optionsmanager
def MakeIcon(self, img):
"""\
hooks/post-receive
--
pyhoca-gui.git (Python X2Go Client (wxPython GUI))
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "pyhoca-gui.git" (Python X2Go Client (wxPython GUI)).
More information about the x2go-commits
mailing list