Make the kitty public key available as an env var to child processes

This commit is contained in:
Kovid Goyal 2022-08-09 20:25:28 +05:30
parent 2aee746da9
commit 1a643441f3
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
4 changed files with 22 additions and 12 deletions

View File

@ -135,6 +135,10 @@ Variables that kitty sets when running child programs
is running. Allows programs to tell kitty to reload its config by sending it is running. Allows programs to tell kitty to reload its config by sending it
the SIGUSR1 signal. the SIGUSR1 signal.
.. envvar:: KITTY_PUBLIC_KEY
A public key that programs can use to communicate securely with kitty using
the remote control protocol.
.. envvar:: KITTY_PREWARM_SOCKET .. envvar:: KITTY_PREWARM_SOCKET

View File

@ -171,6 +171,8 @@ def make_tarfile(ssh_opts: SSHOptions, base_env: Dict[str, str], compression: st
env['KITTY_LOGIN_CWD'] = ssh_opts.cwd env['KITTY_LOGIN_CWD'] = ssh_opts.cwd
if ssh_opts.remote_kitty != 'no': if ssh_opts.remote_kitty != 'no':
env['KITTY_REMOTE'] = ssh_opts.remote_kitty env['KITTY_REMOTE'] = ssh_opts.remote_kitty
if os.environ.get('KITTY_PUBLIC_KEY'):
env['KITTY_PUBLIC_KEY'] = os.environ['KITTY_PUBLIC_KEY']
env_script = serialize_env(literal_env, env, base_env, for_python=compression != 'gz') env_script = serialize_env(literal_env, env, base_env, for_python=compression != 'gz')
buf = io.BytesIO() buf = io.BytesIO()
with tarfile.open(mode=f'w:{compression}', fileobj=buf, encoding='utf-8') as tf: with tarfile.open(mode=f'w:{compression}', fileobj=buf, encoding='utf-8') as tf:

View File

@ -2,6 +2,7 @@
# License: GPL v3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net> # License: GPL v3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>
import atexit import atexit
import base64
import json import json
import os import os
import re import re
@ -22,23 +23,23 @@ from .cli_stub import CLIOptions
from .conf.utils import BadLine, KeyAction, to_cmdline from .conf.utils import BadLine, KeyAction, to_cmdline
from .config import common_opts_as_dict, prepare_config_file_for_editing from .config import common_opts_as_dict, prepare_config_file_for_editing
from .constants import ( from .constants import (
appname, cache_dir, clear_handled_signals, config_dir, handled_signals, RC_ENCRYPTION_PROTOCOL_VERSION, appname, cache_dir, clear_handled_signals,
is_macos, is_wayland, kitty_exe, logo_png_file, supports_primary_selection, config_dir, handled_signals, is_macos, is_wayland, kitty_exe,
website_url logo_png_file, supports_primary_selection, website_url
) )
from .fast_data_types import ( from .fast_data_types import (
CLOSE_BEING_CONFIRMED, GLFW_MOD_ALT, GLFW_MOD_CONTROL, GLFW_MOD_SHIFT, CLOSE_BEING_CONFIRMED, GLFW_MOD_ALT, GLFW_MOD_CONTROL, GLFW_MOD_SHIFT,
GLFW_MOD_SUPER, GLFW_MOUSE_BUTTON_LEFT, GLFW_PRESS, GLFW_MOD_SUPER, GLFW_MOUSE_BUTTON_LEFT, GLFW_PRESS,
IMPERATIVE_CLOSE_REQUESTED, NO_CLOSE_REQUESTED, ChildMonitor, Color, IMPERATIVE_CLOSE_REQUESTED, NO_CLOSE_REQUESTED, ChildMonitor, Color,
KeyEvent, add_timer, apply_options_update, background_opacity_of, EllipticCurveKey, KeyEvent, add_timer, apply_options_update,
change_background_opacity, change_os_window_state, cocoa_set_menubar_title, background_opacity_of, change_background_opacity, change_os_window_state,
create_os_window, current_application_quit_request, current_os_window, cocoa_set_menubar_title, create_os_window,
destroy_global_data, focus_os_window, get_boss, get_clipboard_string, current_application_quit_request, current_os_window, destroy_global_data,
get_options, get_os_window_size, global_font_size, focus_os_window, get_boss, get_clipboard_string, get_options,
mark_os_window_for_close, os_window_font_size, patch_global_colors, get_os_window_size, global_font_size, mark_os_window_for_close,
redirect_mouse_handling, ring_bell, safe_pipe, os_window_font_size, patch_global_colors, redirect_mouse_handling,
set_application_quit_request, set_background_image, set_boss, ring_bell, safe_pipe, set_application_quit_request, set_background_image,
set_clipboard_string, set_in_sequence_mode, set_options, set_boss, set_clipboard_string, set_in_sequence_mode, set_options,
set_os_window_size, set_os_window_title, thread_write, toggle_fullscreen, set_os_window_size, set_os_window_title, thread_write, toggle_fullscreen,
toggle_maximized, toggle_secure_input toggle_maximized, toggle_secure_input
) )
@ -234,6 +235,8 @@ class Boss:
): ):
set_layout_options(opts) set_layout_options(opts)
self.update_check_started = False self.update_check_started = False
self.encryption_key = EllipticCurveKey()
self.encryption_public_key = f'{RC_ENCRYPTION_PROTOCOL_VERSION}:{base64.b85encode(self.encryption_key.public).decode("ascii")}'
self.clipboard_buffers: Dict[str, str] = {} self.clipboard_buffers: Dict[str, str] = {}
self.update_check_process: Optional['PopenType[bytes]'] = None self.update_check_process: Optional['PopenType[bytes]'] = None
self.window_id_map: WeakValueDictionary[int, Window] = WeakValueDictionary() self.window_id_map: WeakValueDictionary[int, Window] = WeakValueDictionary()

View File

@ -250,6 +250,7 @@ class Child:
env['TERM'] = fast_data_types.get_options().term env['TERM'] = fast_data_types.get_options().term
env['COLORTERM'] = 'truecolor' env['COLORTERM'] = 'truecolor'
env['KITTY_PID'] = getpid() env['KITTY_PID'] = getpid()
env['KITTY_PUBLIC_KEY'] = fast_data_types.get_boss().encryption_public_key
if not self.is_prewarmed: if not self.is_prewarmed:
env['KITTY_PREWARM_SOCKET'] = fast_data_types.get_boss().prewarm.socket_env_var() env['KITTY_PREWARM_SOCKET'] = fast_data_types.get_boss().prewarm.socket_env_var()
env['KITTY_PREWARM_SOCKET_REAL_TTY'] = ' ' * 32 env['KITTY_PREWARM_SOCKET_REAL_TTY'] = ' ' * 32