From 067662de948ae25029d8eb96eb8efaf44d19bff2 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 21 Oct 2016 03:53:31 +0530 Subject: [PATCH] Sanitize title and icon names --- kitty/screen.py | 6 +++--- kitty/utils.py | 5 +++++ kitty_tests/datatypes.py | 3 ++- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/kitty/screen.py b/kitty/screen.py index 129cb37d7..c8eb67c13 100644 --- a/kitty/screen.py +++ b/kitty/screen.py @@ -12,7 +12,7 @@ from PyQt5.QtCore import QObject, pyqtSignal from pyte import charsets as cs, control as ctrl, graphics as g, modes as mo from .data_types import Line, Cursor, rewrap_lines -from .utils import wcwidth, is_simple_string +from .utils import wcwidth, is_simple_string, sanitize_title from .unicode import ignore_pat @@ -405,14 +405,14 @@ class Screen(QObject): .. note:: This is an XTerm extension supported by the Linux terminal. """ - self.title_changed.emit(self._decode(param)) + self.title_changed.emit(sanitize_title(self._decode(param))) def set_icon_name(self, param): """Sets icon name. .. note:: This is an XTerm extension supported by the Linux terminal. """ - self.icon_changed.emit(self._decode(param)) + self.icon_changed.emit(sanitize_title(self._decode(param))) def carriage_return(self): """Move the cursor to the beginning of the current line.""" diff --git a/kitty/utils.py b/kitty/utils.py index d759ce329..42067bdf3 100644 --- a/kitty/utils.py +++ b/kitty/utils.py @@ -3,6 +3,7 @@ # License: GPL v3 Copyright: 2016, Kovid Goyal import os +import re import sys import termios import struct @@ -112,3 +113,7 @@ def timeit(name, do_timing=False): yield if do_timing: print('Time for {}: {}'.format(name, monotonic() - st)) + + +def sanitize_title(x): + return re.sub(r'\s+', ' ', re.sub(r'[\0-\x19]', '', x)) diff --git a/kitty_tests/datatypes.py b/kitty_tests/datatypes.py index 7ddcf6aea..7b5204f68 100644 --- a/kitty_tests/datatypes.py +++ b/kitty_tests/datatypes.py @@ -7,7 +7,7 @@ import codecs from . import BaseTest from kitty.data_types import Line, Cursor -from kitty.utils import is_simple_string, wcwidth +from kitty.utils import is_simple_string, wcwidth, sanitize_title class TestDataTypes(BaseTest): @@ -91,3 +91,4 @@ class TestDataTypes(BaseTest): self.assertTrue(is_simple_string(s)) self.assertTrue(is_simple_string(d(s.encode('utf-8')))) self.assertFalse(is_simple_string('a1コ')) + self.assertEqual(sanitize_title('a\0\01 \t\n\f\rb'), 'a b')