The branch, twofactorauth has been updated via 1ddcfcf9bbc3ba029a697b6b7914ccbf67ba71e5 (commit) from 01ea13f9b472bf7139c0640fbddb1cf4309c0861 (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: debian/changelog | 1 + x2go/backends/info/_stdout.py | 82 +++++++++++++++++++++++++++++++++++------ x2go/client.py | 29 ++++++++++++++- 3 files changed, 98 insertions(+), 14 deletions(-) The diff of changes is: diff --git a/debian/changelog b/debian/changelog index b9c9ed2..9393787 100644 --- a/debian/changelog +++ b/debian/changelog @@ -27,6 +27,7 @@ python-x2go (0.4.0.0-0~x2go1) UNRELEASED; urgency=low a disconnect request from the user. - Improve desktop sharing code. Add code to obtain version information of server-side X2Go components. + - Add session type filter for list of sharable desktops. -- Mike Gabriel <mike.gabriel@das-netzwerkteam.de> Thu, 20 Dec 2012 08:58:44 +0100 diff --git a/x2go/backends/info/_stdout.py b/x2go/backends/info/_stdout.py index 0e1a4c5..5553e85 100644 --- a/x2go/backends/info/_stdout.py +++ b/x2go/backends/info/_stdout.py @@ -90,7 +90,7 @@ class X2GoServerSessionInfoSTDOUT(object): @rtype: C{bool} """ - return re.match('.*_stRPUBLISHED_.*', self.name) + return bool(re.match('.*_stRPUBLISHED_.*', self.name)) def is_running(self): """\ @@ -102,6 +102,34 @@ class X2GoServerSessionInfoSTDOUT(object): """ return self.status == 'R' + def get_session_type(self): + """\ + Get the session type (i.e. 'D', 'R', 'S' or 'P'). + + @return: session type + @rtype: C{str} + """ + cmd = self.name.split('_')[1] + session_type = cmd[2] + if session_type == 'R' and self.is_published_applications_provider(): + session_type = 'P' + return session_type + + def get_share_mode(self): + """\ + Get the share mode of a shadow session. + + @return: share mode (0: view-only, 1: full access), C{None} when used for non-desktop-sharing sessions + @rtype: C{str} + + """ + share_mode = None + cmd = self.name.split('_')[1] + session_type = cmd[2] + if session_type == 'S': + share_mode = cmd[3] + return share_mode + def is_suspended(self): """\ Is this session suspended? @@ -120,9 +148,7 @@ class X2GoServerSessionInfoSTDOUT(object): @rtype: C{bool} """ - _desktop_sessions = defaults.X2GO_DESKTOPSESSIONS.keys() - _regexp_desktop_sessions = '(%s)' % "|".join(_desktop_sessions) - return re.match('.*_stD%s_.*' % _regexp_desktop_sessions, self.name) + return self.get_session_type() == 'D' def _parse_x2gostartagent_output(self, x2go_output): """\ @@ -260,7 +286,7 @@ class X2GoServerSessionListSTDOUT(object): C{X2GoControlSessionBACKEND.list_sessions()} call. """ - def __init__(self, x2go_output, info_backend=X2GoServerSessionInfoSTDOUT): + def __init__(self, x2go_output=None, info_backend=X2GoServerSessionInfoSTDOUT): """\ @param x2go_output: X2Go server's C{x2golistsessions} command output, each session separated by a newline character. Session values are separated @@ -271,17 +297,25 @@ class X2GoServerSessionListSTDOUT(object): """ self.sessions = {} - lines = x2go_output.split("\n") - for line in lines: - if not line: - continue - s_info = info_backend() - s_info._parse_x2golistsessions_line(line) - self.sessions[s_info.name] = s_info + if x2go_output is not None: + lines = x2go_output.split("\n") + for line in lines: + if not line: + continue + s_info = info_backend() + s_info._parse_x2golistsessions_line(line) + self.sessions[s_info.name] = s_info def __call__(self): return self.sessions + def set_sessions(self, sessions): + """\ + Set the sessions property directly by parsing a complete data structure. + + """ + self.sessions = sessions + def get_session_info(self, session_name): """\ Retrieve the session information for C{<session_name>}. @@ -297,3 +331,27 @@ class X2GoServerSessionListSTDOUT(object): return self.sessions[session_name] except KeyError: return None + + def get_session_with(self, property_name, value, hostname=None): + """\ + Find session with a given display number on a given host. + + @param property_name: match a session based on this property name + @type property_name: C{str} + @param value: the resulting session has to match this value for C{<property_name>} + @type value: C{str} + @param hostname: the result has to match this hostname + @type hostname: C{str} + + """ + if property_name == 'display': + value = value.lstrip(':') + if '.' in value: value = value.split('.')[0] + + for session in self.sessions.values(): + try: + if str(getattr(session, property_name)) == str(value): + if hostname is None or session.hostname == hostname: + return session + except AttributeError: + pass diff --git a/x2go/client.py b/x2go/client.py index b7fd646..e4ead86 100644 --- a/x2go/client.py +++ b/x2go/client.py @@ -1506,7 +1506,7 @@ class X2GoClient(object): """ - # X2GoClient.list_desktops() uses caching (if enabled, so we prefer lookups here... + # X2GoClient.list_desktops() uses caching (if enabled, so we prefer lookups here...) if desktop: _desktop = desktop user = None @@ -2639,6 +2639,7 @@ class X2GoClient(object): def list_desktops(self, session_uuid=None, profile_name=None, profile_id=None, no_cache=False, refresh_cache=False, + exclude_session_types=[], raw=False): """\ Use the X2Go session registered under C{session_uuid} to @@ -2656,8 +2657,15 @@ class X2GoClient(object): @type profile_name: C{str} @param profile_id: use profile id instead of <profile_name> or <session_uuid> @type profile_id: C{str} - @param no_cache: do not get the session list from cache, query the X2Go server directly + @param no_cache: do not get the desktop list from cache, query the X2Go server directly @type no_cache: C{bool} + @param refresh_cache: query the X2Go server directly and update the desktop list cache + with the new information + @type refresh_cache: C{bool} + @param excluded_session_types: session types (e.g. "D", "R", "S" or "P") to be excluded from the + returned list of sharable desktops (this only works for sharing someone's own sessions, for + sharing other users' sessions, the X2Go Desktop Sharing decides on what is sharable and what not). + @type excluded_session_types: C{list} @param raw: output the session list in X2Go's raw C{x2golistdesktops} format @type raw: C{bool} @@ -2696,6 +2704,23 @@ class X2GoClient(object): self.__update_cache_by_session_uuid(session_uuid, update_sessions=False, update_desktops=True) _desktop_list = self.listsessions_cache.list_desktops(session_uuid) + # attempt to exclude session types that are requested to be excluded + if exclude_session_types: + + # create an X2GoServerSessionList* instance and operate on that + session_list = self.list_backend() + session_list.set_sessions(self._X2GoClient__list_sessions(session_uuid)) + + # search for a match among the listed sessions + for desktop in copy.deepcopy(_desktop_list): + user = desktop.split('@')[0] + if user == self.get_session_username(session_uuid): + display = desktop.split('@')[1] + session = session_list.get_session_with('display', display, hostname=self.get_session_server_hostname(session_uuid)) + if session is None: continue + if session.get_session_type() in exclude_session_types: + _desktop_list.remove(desktop) + return _desktop_list __list_desktops = list_desktops hooks/post-receive -- python-x2go.git (Python X2Go Client API) 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 "python-x2go.git" (Python X2Go Client API).