From: Christian Persch Date: Fri, 25 Dec 2020 18:01:12 +0100 Subject: server: Filter environment variables in the server too Origin: upstream, 3.39.0, commit:8979ac4cbfbaa11237ddaf5132393f6a99d0c6ea --- src/Makefile.am | 2 ++ src/terminal-client-utils.c | 88 ++++++++++++++++++++++++++++++--------------- src/terminal-client-utils.h | 6 +++- src/terminal-screen.c | 19 +++------- 4 files changed, 72 insertions(+), 43 deletions(-) diff --git a/src/Makefile.am b/src/Makefile.am index 2ea3d93..4583cfc 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -45,6 +45,8 @@ gnome_terminal_server_SOURCES = \ terminal-accels.h \ terminal-app.c \ terminal-app.h \ + terminal-client-utils.c \ + terminal-client-utils.h \ terminal-debug.c \ terminal-debug.h \ terminal-defines.h \ diff --git a/src/terminal-client-utils.c b/src/terminal-client-utils.c index e929281..55f56ab 100644 --- a/src/terminal-client-utils.c +++ b/src/terminal-client-utils.c @@ -99,6 +99,65 @@ terminal_client_append_create_instance_options (GVariantBuilder *builder, "fullscreen-window", g_variant_new_boolean (TRUE)); } +char const* const* +terminal_client_get_environment_filters (void) +{ + static char const* filters[] = { + "COLORTERM", + "COLUMNS", + "DESKTOP_STARTUP_ID", + "EXIT_CODE", + "EXIT_STATUS", + "GIO_LAUNCHED_DESKTOP_FILE", + "GIO_LAUNCHED_DESKTOP_FILE_PID", + "GNOME_DESKTOP_ICON", + "INVOCATION_ID", + "JOURNAL_STREAM", + "LINES", + "LISTEN_FDNAMES", + "LISTEN_FDS", + "LISTEN_PID", + "MAINPID", + "MANAGERPID", + "NOTIFY_SOCKET", + "NOTIFY_SOCKET", + "PIDFILE", + "PWD", + "REMOTE_ADDR", + "REMOTE_PORT", + "SERVICE_RESULT", + "TERM", + "VTE_VERSION", + "WATCHDOG_PID", + "WATCHDOG_USEC", + "WINDOWID", + NULL + }; + + return filters; +} + +/** + * terminal_client_filter_environment: + * @envv: (transfer full): the environment + * + * Filters unwanted variables from @envv, and returns it. + * + * Returns: (transfer full): the filtered environment + */ +char** +terminal_client_filter_environment (char** envv) +{ + if (envv == NULL) + return NULL; + + char const* const* filters = terminal_client_get_environment_filters (); + for (unsigned i = 0; filters[i]; ++i) + envv = g_environ_unsetenv (envv, filters[i]); + + return envv; +} + /** * terminal_client_append_exec_options: * @builder: a #GVariantBuilder of #GVariantType "a{sv}" @@ -122,34 +181,7 @@ terminal_client_append_exec_options (GVariantBuilder *builder, gs_strfreev char **envv; envv = g_get_environ (); - envv = g_environ_unsetenv (envv, "COLORTERM"); - envv = g_environ_unsetenv (envv, "COLUMNS"); - envv = g_environ_unsetenv (envv, "DESKTOP_STARTUP_ID"); - envv = g_environ_unsetenv (envv, "EXIT_CODE"); - envv = g_environ_unsetenv (envv, "EXIT_STATUS"); - envv = g_environ_unsetenv (envv, "GIO_LAUNCHED_DESKTOP_FILE"); - envv = g_environ_unsetenv (envv, "GIO_LAUNCHED_DESKTOP_FILE_PID"); - envv = g_environ_unsetenv (envv, "GNOME_DESKTOP_ICON"); - envv = g_environ_unsetenv (envv, "INVOCATION_ID"); - envv = g_environ_unsetenv (envv, "JOURNAL_STREAM"); - envv = g_environ_unsetenv (envv, "LINES"); - envv = g_environ_unsetenv (envv, "LISTEN_FDNAMES"); - envv = g_environ_unsetenv (envv, "LISTEN_FDS"); - envv = g_environ_unsetenv (envv, "LISTEN_PID"); - envv = g_environ_unsetenv (envv, "MAINPID"); - envv = g_environ_unsetenv (envv, "MANAGERPID"); - envv = g_environ_unsetenv (envv, "NOTIFY_SOCKET"); - envv = g_environ_unsetenv (envv, "NOTIFY_SOCKET"); - envv = g_environ_unsetenv (envv, "PIDFILE"); - envv = g_environ_unsetenv (envv, "PWD"); - envv = g_environ_unsetenv (envv, "REMOTE_ADDR"); - envv = g_environ_unsetenv (envv, "REMOTE_PORT"); - envv = g_environ_unsetenv (envv, "SERVICE_RESULT"); - envv = g_environ_unsetenv (envv, "TERM"); - envv = g_environ_unsetenv (envv, "VTE_VERSION"); - envv = g_environ_unsetenv (envv, "WATCHDOG_PID"); - envv = g_environ_unsetenv (envv, "WATCHDOG_USEC"); - envv = g_environ_unsetenv (envv, "WINDOWID"); + envv = terminal_client_filter_environment (envv); envv = g_environ_unsetenv (envv, TERMINAL_ENV_SERVICE_NAME); envv = g_environ_unsetenv (envv, TERMINAL_ENV_SCREEN); diff --git a/src/terminal-client-utils.h b/src/terminal-client-utils.h index 0a70637..19a0a2b 100644 --- a/src/terminal-client-utils.h +++ b/src/terminal-client-utils.h @@ -47,7 +47,11 @@ void terminal_client_append_exec_options (GVariantBuilder *builder, gsize fd_array_len, gboolean shell); -char * terminal_client_get_fallback_startup_id (void); +char * terminal_client_get_fallback_startup_id (void) G_GNUC_MALLOC; + +char const* const* terminal_client_get_environment_filters (void); + +char** terminal_client_filter_environment (char** envv) G_GNUC_MALLOC; G_END_DECLS diff --git a/src/terminal-screen.c b/src/terminal-screen.c index 0c4ee50..0e447ae 100644 --- a/src/terminal-screen.c +++ b/src/terminal-screen.c @@ -21,6 +21,7 @@ #include "terminal-pcre2.h" #include "terminal-regex.h" #include "terminal-screen.h" +#include "terminal-client-utils.h" #include #include @@ -1455,20 +1456,10 @@ terminal_screen_get_child_environment (TerminalScreen *screen, } } - g_hash_table_remove (env_table, "COLUMNS"); - g_hash_table_remove (env_table, "LINES"); - g_hash_table_remove (env_table, "GNOME_DESKTOP_ICON"); - - /* WINDOWID does not work correctly ever since we don't use a native - * GdkWindow anymore, and it also becomes incorrect if the screen is - * moved to a different window, or the window unrealized and re-realized. - * Additionally, it cannot ever work on non-X11 displays like wayland. - * And on X11, the only use for this is broken foreign drawing on the - * window (w3m etc), and trying to find the focused screen (brltty), - * which can now be done correctly using DECSET 1004. - * Therefore we do not set WINDOWID, and remove an existing variable. - */ - g_hash_table_remove (env_table, "WINDOWID"); + /* Remove unwanted env variables */ + char const* const* filters = terminal_client_get_environment_filters (); + for (i = 0; filters[i]; ++i) + g_hash_table_remove (env_table, filters[i]); terminal_util_add_proxy_env (env_table);