diff --git a/src/xpra/server/source.py b/src/xpra/server/source.py index 9962afee4e..da05e875bc 100644 --- a/src/xpra/server/source.py +++ b/src/xpra/server/source.py @@ -39,6 +39,8 @@ NOYIELD = os.environ.get("XPRA_YIELD") is None debug = log.debug +MAX_CLIPBOARD_PER_SECOND = 5 + def get_generic_window_type(window, strip_net=True): window_types = window.get_property("window-type") @@ -268,6 +270,8 @@ def __init__(self, protocol, disconnect_cb, idle_add, timeout_add, source_remove self.last_user_event = time.time() self.last_ping_echoed_time = 0 + self.clipboard_stats = deque(maxlen=MAX_CLIPBOARD_PER_SECOND) + self.init_vars() # ready for processing: @@ -1224,6 +1228,16 @@ def send_clipboard_enabled(self, reason=""): def send_clipboard(self, packet): if not self.clipboard_enabled or self.suspended: return + now = time.time() + self.clipboard_stats.append(now) + if len(self.clipboard_stats)>=MAX_CLIPBOARD_PER_SECOND: + elapsed = now-self.clipboard_stats[0] + if elapsed<1: + msg = "more than %s clipboard requests per second!" % MAX_CLIPBOARD_PER_SECOND + log.warn("clipboard disabled: %s", msg) + self.clipboard_enabled = False + self.send_clipboard_enabled(msg) + return #call compress_clibboard via the work queue: self.compression_work_queue.put((self.compress_clipboard, packet))