This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch master in repository python-x2go. commit 3fbee6ad5c04d3c49f73b4232f580248ba24714a Author: Mike Gabriel <mike.gabriel@das-netzwerkteam.de> Date: Tue Sep 18 16:26:40 2018 +0000 Correctly handle IO objects (BytesIO in Python3, StringIO in Python2). --- x2go/backends/control/plain.py | 57 ++++++++++++++++++++++++++-------------- x2go/backends/terminal/plain.py | 58 +++++++++++++++++++++++++++++++---------- x2go/inifiles.py | 5 +++- 3 files changed, 86 insertions(+), 34 deletions(-) diff --git a/x2go/backends/control/plain.py b/x2go/backends/control/plain.py index 104a25b..40c4a0f 100644 --- a/x2go/backends/control/plain.py +++ b/x2go/backends/control/plain.py @@ -473,7 +473,10 @@ class X2GoControlSession(paramiko.SSHClient): if self.session_died: self.logger("control session seams to be dead, not executing command ,,%s'' on X2Go server %s" % (_rerewrite_blanks(cmd), self.profile_name,), loglevel=loglevel) - return (io.StringIO(), io.StringIO(), io.StringIO(u'failed to execute command')) + if sys.version_info[0] >= 3: + return (io.BytesIO(), io.BytesIO(), io.BytesIO(b'failed to execute command')) + else: + return (io.StringIO(), io.StringIO(), io.StringIO(u'failed to execute command')) self._transport_lock.acquire() @@ -531,13 +534,13 @@ class X2GoControlSession(paramiko.SSHClient): if self._transport_lock.locked(): self._transport_lock.release() - # sanitized X2Go relevant data, protect against data injection via .bashrc files - (_stdin, _stdout, _stderr) = _retval - raw_stdout = _stdout.read() - sanitized_stdout = u'' is_x2go_data = False + # sanitized X2Go relevant data, protect against data injection via .bashrc files + (stdin, stdout, stderr) = _retval + raw_stdout = stdout.read() + # Python 3 needs a decoding from bytestring to string if sys.version_info[0] >= 3: raw_stdout = raw_stdout.decode() @@ -553,9 +556,12 @@ class X2GoControlSession(paramiko.SSHClient): if line.startswith('X2GODATAEND:'+cmd_uuid): break sanitized_stdout += line + "\n" - _stdout_new = io.StringIO(sanitized_stdout) + if sys.version_info[0] >= 3: + _stdout_new = io.BytesIO(sanitized_stdout.encode()) + else: + _stdout_new = io.StringIO(sanitized_stdout) - _retval = (_stdin, _stdout_new, _stderr) + _retval = (stdin, _stdout_new, stderr) return _retval @property @@ -602,7 +608,10 @@ class X2GoControlSession(paramiko.SSHClient): """ if self._server_features is None: (stdin, stdout, stderr) = self._x2go_exec_command('which x2gofeaturelist >/dev/null && x2gofeaturelist') - self._server_features = stdout.read().split('\n') + _stdout = stdout.read() + if sys.version_info[0] >= 3: + _stdout = _stdout.decode() + self._server_features = _stdout.split('\n') self._server_features = [ f for f in self._server_features if f ] self._server_features.sort() self.logger('server-side X2Go features are: %s' % self._server_features, loglevel=log.loglevel_DEBUG) @@ -632,9 +641,11 @@ class X2GoControlSession(paramiko.SSHClient): """ if self._remote_home is None: (stdin, stdout, stderr) = self._x2go_exec_command('echo $HOME') - stdout_r = stdout.read() - if stdout_r: - self._remote_home = stdout_r.split()[0] + _stdout = stdout.read() + if sys.version_info[0] >= 3: + _stdout = _stdout.decode() + if _stdout: + self._remote_home = _stdout.split()[0] self.logger('remote user\' home directory: %s' % self._remote_home, loglevel=log.loglevel_DEBUG) return self._remote_home else: @@ -1261,8 +1272,10 @@ class X2GoControlSession(paramiko.SSHClient): :rtype: ``bool`` """ - (_stdin, _stdout, _stderr) = self._x2go_exec_command('stat -tL "%s"' % self._x2go_remote_home, loglevel=log.loglevel_DEBUG) - if _stdout.read(): + (stdin, stdout, stderr) = self._x2go_exec_command('stat -tL "%s"' % self._x2go_remote_home, loglevel=log.loglevel_DEBUG) + _stdout = stdout.read() + print (_stdout) + if _stdout: return True return False @@ -1653,8 +1666,10 @@ class X2GoControlSession(paramiko.SSHClient): timeout.start() try: (stdin, stdout, stderr) = self._x2go_exec_command("export HOSTNAME && x2golistdesktops") - _stdout_read = stdout.read() - _listdesktops = _stdout_read.split('\n') + _stdout = stdout.read() + if sys.version_info[0] >= 3: + _stdout = _stdout.decode() + _listdesktops = _stdout.split('\n') except gevent.timeout.Timeout: # if we do not get a reply here after <maxwait> seconds we will raise a time out, we have to # make sure that we catch this at places where we want to ignore timeouts (e.g. in the @@ -1698,8 +1713,10 @@ class X2GoControlSession(paramiko.SSHClient): timeout.start() try: (stdin, stdout, stderr) = self._x2go_exec_command("export HOSTNAME && x2golistmounts %s" % session_name) - _stdout_read = stdout.read() - _listmounts = {session_name: [ line for line in _stdout_read.split('\n') if line ] } + _stdout = stdout.read() + if sys.version_info[0] >= 3: + _stdout = _stdout.decode() + _listmounts = {session_name: [ line for line in _stdout.split('\n') if line ] } except gevent.timeout.Timeout: # if we do not get a reply here after <maxwait> seconds we will raise a time out, we have to # make sure that we catch this at places where we want to ignore timeouts @@ -1749,8 +1766,10 @@ class X2GoControlSession(paramiko.SSHClient): (stdin, stdout, stderr) = self._x2go_exec_command("export HOSTNAME && { x2golistsessions; x2golistshadowsessions; }") else: (stdin, stdout, stderr) = self._x2go_exec_command("export HOSTNAME && x2golistsessions") - _stdout_read = stdout.read() - _listsessions = self._list_backend(_stdout_read, info_backend=self._info_backend).sessions + _stdout = stdout.read() + if sys.version_info[0] >= 3: + _stdout = _stdout.decode() + _listsessions = self._list_backend(_stdout, info_backend=self._info_backend).sessions _success = True except KeyError: gevent.sleep(1) diff --git a/x2go/backends/terminal/plain.py b/x2go/backends/terminal/plain.py index df143d0..7717be6 100644 --- a/x2go/backends/terminal/plain.py +++ b/x2go/backends/terminal/plain.py @@ -892,13 +892,19 @@ class X2GoTerminalSession(object): _auth_rsakey = self.control_session._x2go_session_auth_rsakey _host_rsakey = defaults.RSAHostKey - _tmp_io_object = io.StringIO() + if sys.version_info[0] >= 3: + _tmp_io_object = io.BytesIO() + else: + _tmp_io_object = io.StringIO() _auth_rsakey.write_private_key(_tmp_io_object) - _tmp_io_object.write(u'----BEGIN RSA IDENTITY----') - _tmp_io_object.write(u'%s %s' % (_host_rsakey.get_name(),_host_rsakey.get_base64(),)) - + if sys.version_info[0] >= 3: + _tmp_io_object.write(b'----BEGIN RSA IDENTITY----') + _tmp_io_object.write(b'%b %b' % (_host_rsakey.get_name().encode(),_host_rsakey.get_base64().encode(),)) + else: + _tmp_io_object.write(u'----BEGIN RSA IDENTITY----') + _tmp_io_object.write(u'%s %s' % (_host_rsakey.get_name(),_host_rsakey.get_base64(),)) # _x2go_key_fname must be a UniX path - _x2go_key_fname = u'%s/%s/%s' % (os.path.dirname(self.session_info.remote_container), 'ssh', 'key.z%s' % self.session_info.agent_pid) + _x2go_key_fname = '%s/%s/%s' % (os.path.dirname(self.session_info.remote_container), 'ssh', 'key.z%s' % self.session_info.agent_pid) _x2go_key_bundle = _tmp_io_object.getvalue() # if there is another call to this method currently being processed, wait for that one to finish @@ -968,10 +974,15 @@ class X2GoTerminalSession(object): ] (stdin, stdout, stderr) = self.control_session._x2go_exec_command(cmd_line) - _stdout = stdout.read().split('\n') + _stdout = stdout.read() + _stderr = stderr.read() + if sys.version_info[0] >= 3: + _stdout = _stdout.decode() + _stderr = _stderr.decode() + _stdout = _stdout.split('\n') if _stdout[0]: self.logger('x2gomountdirs stdout is: %s' % _stdout, log.loglevel_NOTICE) - _stderr = stderr.read().split('\n') + _stderr = _stderr.split('\n') if _stderr[0]: self.logger('x2gomountdirs stderr is: %s' % _stderr, log.loglevel_WARN) @@ -1002,7 +1013,10 @@ class X2GoTerminalSession(object): ] (stdin, stdout, stderr) = self.control_session._x2go_exec_command(cmd_line) - if not stderr.read(): + _stderr = stderr.read() + if sys.version_info[0] >= 3: + _stderr = _stderr.decode() + if not _stderr: self.logger('x2goumount-session (all mounts) for session %s has been successful' % self.session_info, log.loglevel_NOTICE) return True else: @@ -1028,7 +1042,10 @@ class X2GoTerminalSession(object): ] (stdin, stdout, stderr) = self.control_session._x2go_exec_command(cmd_line) - if not stderr.read(): + _stderr = stderr.read() + if sys.version_info[0] >= 3: + _stderr = _stderr.decode() + if not _stderr: self.logger('x2goumount-session (%s) for session %s has been successful' % (local_path, self.session_info, ), log.loglevel_NOTICE) return True else: @@ -1273,6 +1290,8 @@ class X2GoTerminalSession(object): if test_cmd: (stdin, stdout, stderr) = self.control_session._x2go_exec_command([test_cmd]) _stdout = stdout.read() + if sys.version_info[0] >= 3: + _stdout = _stdout.decode() return _stdout.find('OK') != -1 else: return False @@ -1342,7 +1361,10 @@ class X2GoTerminalSession(object): if self.params.kbtype not in ('null/null', 'auto') and (self.params.kblayout not in ('null', '') or self.params.kbvariant not in ('null', '')): self.set_keyboard(layout=self.params.kblayout, variant=self.params.kbvariant) - return stdout.read(), stderr.read() + if sys.version_info[0] >= 3: + return stdout.read().decode(), stderr.read().decode() + else: + return stdout.read(), stderr.read() def is_desktop_session(self): """\ @@ -1400,12 +1422,12 @@ class X2GoTerminalSession(object): (stdin, stdout, stderr) = self.control_session._x2go_exec_command(cmd_line) _stderr = stderr.read() + if sys.version_info[0] >= 3: + _stderr.decode() if not _stderr: self.logger('setting keyboard layout ,,%s\'\' and variant ,,%s\'\' for session %s has been successful' % (layout, variant, self.session_info), log.loglevel_NOTICE) return True else: - if sys.version_info[0] >= 3: - _stderr = _stderr.decode() self.logger('setting keyboard layout ,,%s\'\' and variant ,,%s\'\' for session %s failed: %s' % (layout, variant, self.session_info, _stderr.replace('\n', ' ')), log.loglevel_ERROR) return False @@ -1566,9 +1588,13 @@ class X2GoTerminalSession(object): _stdout = stdout.read() _stderr = stderr.read() + if sys.version_info[0] >= 3: + _stdout = _stdout.decode() + _stderr = _stderr.decode() + # if the first line of stdout is a "DEN(Y)" string then we will presume that # we tried to use X2Go desktop sharing and the sharing was rejected - if b"ACCESS DENIED" in _stderr and b"XSHAD" in _stderr: + if "ACCESS DENIED" in _stderr and "XSHAD" in _stderr: raise x2go_exceptions.X2GoDesktopSharingDenied('X2Go desktop sharing has been denied by the remote user') try: @@ -1651,8 +1677,12 @@ class X2GoTerminalSession(object): (stdin, stdout, stderr) = self.control_session._x2go_exec_command(cmd_line) + _stdout = stdout.read() + if sys.version_info[0] >= 3: + _stdout = _stdout.decode() + # re-allocate (if needed) server-side ports for graphics, sound and sshfs - for stdout_line in stdout.read(): + for stdout_line in _stdout.split('\n'): try: _new_value = stdout_line.split("=")[1].strip() if 'gr_port=' in stdout_line and _new_value != str(self.session_info.graphics_port): diff --git a/x2go/inifiles.py b/x2go/inifiles.py index f549d5c..244602c 100644 --- a/x2go/inifiles.py +++ b/x2go/inifiles.py @@ -286,7 +286,10 @@ class X2GoIniFile(object): """ - stdout = io.StringIO() + if sys.version_info[0] >= 3: + stdout = io.BytesIO() + else: + stdout = io.StringIO() self.iniConfig.write(stdout) _ret_val = stdout.getvalue() stdout.close() -- Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/python-x2go.git