def parse_client_caps(self, c: typedict): self.vrefresh = c.intget("vrefresh", -1) self.randr_notify = c.boolget("randr_notify") self.desktop_size = c.intpair("desktop_size") if self.desktop_size is not None: w, h = self.desktop_size if w <= 0 or h <= 0 or w >= 32768 or h >= 32768: log.warn("ignoring invalid desktop dimensions: %sx%s", w, h) self.desktop_size = None self.desktop_mode_size = c.intpair("desktop_mode_size") self.desktop_size_unscaled = c.intpair("desktop_size.unscaled") self.screen_resize_bigger = c.boolget("screen-resize-bigger", True) self.set_screen_sizes(c.tupleget("screen_sizes")) desktop_names = tuple(net_utf8(x) for x in c.tupleget("desktop.names")) self.set_desktops(c.intget("desktops", 1), desktop_names) self.show_desktop_allowed = c.boolget("show-desktop") self.icc = c.dictget("icc", {}) self.display_icc = c.dictget("display-icc", {}) self.opengl_props = c.dictget("opengl", {})
def do_command(self, caps : typedict): cr = caps.tupleget("command_response") if cr is None: self.warn_and_quit(EXIT_UNSUPPORTED, "server does not support control command") return code, text = cr text = bytestostr(text) if code!=0: log.warn("server returned error code %s", code) self.warn_and_quit(EXIT_REMOTE_ERROR, " %s" % text) return self.warn_and_quit(EXIT_OK, text)
def parse_server_capabilities(self, c: typedict) -> bool: p = self._protocol if p.TYPE == "rfb": #only the xpra protocol provides the server info return True self._remote_machine_id = c.strget("machine_id") self._remote_uuid = c.strget("uuid") self._remote_version = c.strget("build.version", c.strget("version")) self._remote_revision = c.strget("build.revision", c.strget("revision")) mods = c.get("build.local_modifications") if mods and str(mods).find("dfsg") >= 0: # pragma: no cover get_util_logger().warn( "Warning: the xpra server is running a buggy Debian version") get_util_logger().warn( " those are usually out of date and unstable") else: self._remote_modifications = c.intget("build.local_modifications", 0) self._remote_commit = c.strget("build.commit") self._remote_branch = c.strget("build.branch") self._remote_build_date = c.strget("build.date") self._remote_build_time = c.strget("build.time") self._remote_hostname = c.strget("hostname") self._remote_display = c.strget("display") self._remote_platform = c.strget("platform") self._remote_platform_release = c.strget("platform.release") self._remote_platform_platform = c.strget("platform.platform") self._remote_python_version = c.strget("python.version") self._remote_subcommands = c.strtupleget("subcommands") self._remote_server_log = c.strget("server-log") self._remote_lib_versions = get_remote_lib_versions(c) #linux distribution is a tuple of different types, ie: ('Linux Fedora' , 20, 'Heisenbug') pld = c.tupleget("platform.linux_distribution") if pld and len(pld) == 3: def san(v): if isinstance(v, int): return v return bytestostr(v) self._remote_platform_linux_distribution = [san(x) for x in pld] verr = version_compat_check(self._remote_version) if verr is not None: self.warn_and_quit( EXIT_INCOMPATIBLE_VERSION, "incompatible remote version '%s': %s" % (self._remote_version, verr)) return False return True
def parse_server_capabilities(self, c : typedict) -> bool: self._remote_machine_id = c.strget("machine_id") self._remote_uuid = c.strget("uuid") self._remote_version = c.strget("build.version", c.strget("version")) self._remote_revision = c.strget("build.revision", c.strget("revision")) mods = c.rawget("build.local_modifications") if mods and str(mods).find("dfsg")>=0: get_util_logger().warn("Warning: the xpra server is running a buggy Debian version") get_util_logger().warn(" those are usually out of date and unstable") else: self._remote_modifications = c.intget("build.local_modifications", 0) self._remote_build_date = c.strget("build.date") self._remote_build_time = c.strget("build.time") self._remote_hostname = c.strget("hostname") self._remote_display = c.strget("display") self._remote_platform = c.strget("platform") self._remote_platform_release = c.strget("platform.release") self._remote_platform_platform = c.strget("platform.platform") self._remote_python_version = c.strget("python.version") self._remote_subcommands = c.strtupleget("subcommands") for x in ("glib", "gobject", "gtk", "gdk", "cairo", "pango", "sound.gst", "sound.pygst"): v = c.rawget("%s.version" % x, None) if v is not None: self._remote_lib_versions[x] = v #linux distribution is a tuple of different types, ie: ('Linux Fedora' , 20, 'Heisenbug') pld = c.tupleget("platform.linux_distribution") if pld and len(pld)==3: def san(v): if isinstance(v, int): return v return bytestostr(v) self._remote_platform_linux_distribution = [san(x) for x in pld] verr = version_compat_check(self._remote_version) if verr is not None: self.warn_and_quit(EXIT_INCOMPATIBLE_VERSION, "incompatible remote version '%s': %s" % (self._remote_version, verr)) return False return True
def parse_server_capabilities(self, c: typedict) -> bool: for cb in CLIENT_BASES: if not cb.parse_server_capabilities(self, c): log.info("failed to parse server capabilities in %s", cb) return False self.server_session_name = strtobytes(c.rawget("session_name", b"")).decode("utf-8") set_name("Xpra", self.session_name or self.server_session_name or "Xpra") self.server_platform = c.strget("platform") self.server_sharing = c.boolget("sharing") self.server_sharing_toggle = c.boolget("sharing-toggle") self.server_lock = c.boolget("lock") self.server_lock_toggle = c.boolget("lock-toggle") self.server_keyboard = c.boolget("keyboard", True) self.server_pointer = c.boolget("pointer", True) self.server_start_new_commands = c.boolget("start-new-commands") if self.server_start_new_commands: self.server_xdg_menu = c.dictget("xdg-menu", None) if self.start_new_commands or self.start_child_new_commands: if self.server_start_new_commands: self.after_handshake(self.send_start_new_commands) else: log.warn("Warning: cannot start new commands") log.warn(" the feature is currently disabled on the server") self.server_commands_info = c.boolget("server-commands-info") self.server_commands_signals = c.strtupleget("server-commands-signals") self.server_readonly = c.boolget("readonly") if self.server_readonly and not self.readonly: log.info("server is read only") self.readonly = True if not self.server_keyboard and self.keyboard_helper: #swallow packets: def nosend(*_args): pass self.keyboard_helper.send = nosend i = platform_name( self._remote_platform, c.strtupleget("platform.linux_distribution") or c.strget("platform.release", "")) r = self._remote_version if self._remote_revision: r += "-r%s" % self._remote_revision mode = c.strget("server.mode", "server") bits = c.intget("python.bits", 32) log.info("Xpra %s server version %s %i-bit", mode, std(r), bits) if i: log.info(" running on %s", std(i)) if c.boolget("desktop") or c.boolget("shadow"): v = c.intpair("actual_desktop_size") if v: w, h = v ss = c.tupleget("screen_sizes") if ss: log.info(" remote desktop size is %sx%s with %s screen%s:", w, h, len(ss), engs(ss)) log_screen_sizes(w, h, ss) else: log.info(" remote desktop size is %sx%s", w, h) if c.boolget("proxy"): proxy_hostname = c.strget("proxy.hostname") proxy_platform = c.strget("proxy.platform") proxy_release = c.strget("proxy.platform.release") proxy_version = c.strget("proxy.version") proxy_version = c.strget("proxy.build.version", proxy_version) proxy_distro = c.strget("proxy.linux_distribution") msg = "via: %s proxy version %s" % (platform_name( proxy_platform, proxy_distro or proxy_release), std(proxy_version or "unknown")) if proxy_hostname: msg += " on '%s'" % std(proxy_hostname) log.info(msg) return True