From 54d94d93b06574b9692f324306168f5364a5c295 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 26 Apr 2026 09:35:37 +0530 Subject: [PATCH] Allow turning off geninclude when parsing config --- kitty/conf/utils.py | 20 +++++++++++++++----- kitty/config.py | 6 +++++- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/kitty/conf/utils.py b/kitty/conf/utils.py index ca92fe195..479df9d1e 100644 --- a/kitty/conf/utils.py +++ b/kitty/conf/utils.py @@ -281,6 +281,7 @@ def parse_line( effective_config_lines: Callable[[str, str], None], memory: Memory, accumulate_bad_lines: list[BadLine] | None = None, + allow_geninclude: bool = True, ) -> None: line = line.strip() if not line or line.startswith('#'): @@ -302,10 +303,14 @@ def parse_line( with currently_parsing.set_file(f''): _parse( NamedLineIterator(os.path.join(base_path_for_includes, ''), iter(os.environ[x].splitlines())), - parse_conf_item, ans, memory, accumulate_bad_lines, effective_config_lines + parse_conf_item, ans, memory, accumulate_bad_lines, effective_config_lines, + allow_geninclude=allow_geninclude ) return elif key == 'geninclude': + if not allow_geninclude: + log_error('Ignoring geninclude directive for security') + return if not os.path.isabs(val): val = os.path.join(base_path_for_includes, val) if not memory.seen(val): @@ -320,7 +325,8 @@ def parse_line( with currently_parsing.set_file(f''): _parse( NamedLineIterator(os.path.join(base_path_for_includes, ''), iter(lines)), - parse_conf_item, ans, memory, accumulate_bad_lines, effective_config_lines + parse_conf_item, ans, memory, accumulate_bad_lines, effective_config_lines, + allow_geninclude=allow_geninclude ) return else: @@ -333,7 +339,9 @@ def parse_line( try: with open(val, encoding='utf-8', errors='replace') as include: with currently_parsing.set_file(val): - _parse(include, parse_conf_item, ans, memory, accumulate_bad_lines, effective_config_lines) + _parse( + include, parse_conf_item, ans, memory, accumulate_bad_lines, effective_config_lines, + allow_geninclude=allow_geninclude) except FileNotFoundError: log_error(f'Could not find included config file: {val}, ignoring') except OSError: @@ -356,6 +364,7 @@ def _parse( memory: Memory, accumulate_bad_lines: list[BadLine] | None = None, effective_config_lines: Callable[[str, str], None] | None = None, + allow_geninclude: bool = True, ) -> None: name = getattr(lines, 'name', None) effective_config_lines = effective_config_lines or (lambda a, b: None) @@ -395,7 +404,7 @@ def _parse( next_line = '' try: with currently_parsing.set_line(line, line_num): - parse_line(line, parse_conf_item, ans, base_path_for_includes, effective_config_lines, memory, accumulate_bad_lines) + parse_line(line, parse_conf_item, ans, base_path_for_includes, effective_config_lines, memory, accumulate_bad_lines, allow_geninclude) except Exception as e: if accumulate_bad_lines is None: raise @@ -410,8 +419,9 @@ def parse_config_base( ans: dict[str, Any], accumulate_bad_lines: list[BadLine] | None = None, effective_config_lines: Callable[[str, str], None] | None = None, + allow_geninclude: bool = True, ) -> None: - _parse(lines, parse_conf_item, ans, Memory(accumulate_bad_lines), accumulate_bad_lines, effective_config_lines) + _parse(lines, parse_conf_item, ans, Memory(accumulate_bad_lines), accumulate_bad_lines, effective_config_lines, allow_geninclude) def merge_dicts(defaults: dict[str, Any], newvals: dict[str, Any]) -> dict[str, Any]: diff --git a/kitty/config.py b/kitty/config.py index 169364468..f63dfdb5b 100644 --- a/kitty/config.py +++ b/kitty/config.py @@ -142,7 +142,10 @@ def finalize_mouse_mappings(opts: Options, accumulate_bad_lines: list[BadLine] | def parse_config( - lines: Iterable[str], accumulate_bad_lines: list[BadLine] | None = None, effective_config_lines: Callable[[str, str], None] | None = None + lines: Iterable[str], + accumulate_bad_lines: list[BadLine] | None = None, + effective_config_lines: Callable[[str, str], None] | None = None, + allow_geninclude: bool = True, ) -> dict[str, Any]: from .options.parse import create_result_dict, parse_conf_item ans: dict[str, Any] = create_result_dict() @@ -152,6 +155,7 @@ def parse_config( ans, accumulate_bad_lines=accumulate_bad_lines, effective_config_lines=effective_config_lines, + allow_geninclude=allow_geninclude, ) return ans