diff options
author | Ray Strode <halfline@gmail.com> | 2022-03-29 17:49:52 +0000 |
---|---|---|
committer | Ray Strode <halfline@gmail.com> | 2022-03-29 17:49:52 +0000 |
commit | e40a59d2c2c2e7d0cde9c5b2c714ec37d1d6f785 (patch) | |
tree | 3804c59cf865d93d80bcb5f1c6eb26bb2629d3d3 | |
parent | 88c54ffbeea73b5fa40ac90b3b0a1c8e68d25c73 (diff) | |
parent | 5d1b49c601a085120e834c1e9134593318465eec (diff) |
Merge branch 'tt-keyfilter' into 'main'
core, script: add support for filtering input characters in plugins
See merge request plymouth/plymouth!169
-rw-r--r-- | src/libply-splash-core/ply-boot-splash-plugin.h | 3 | ||||
-rw-r--r-- | src/libply-splash-core/ply-boot-splash.c | 12 | ||||
-rw-r--r-- | src/libply-splash-core/ply-boot-splash.h | 3 | ||||
-rw-r--r-- | src/main.c | 19 | ||||
-rw-r--r-- | src/plugins/splash/script/plugin.c | 12 | ||||
-rw-r--r-- | src/plugins/splash/script/script-lib-plymouth.c | 30 | ||||
-rw-r--r-- | src/plugins/splash/script/script-lib-plymouth.h | 5 | ||||
-rw-r--r-- | src/plugins/splash/script/script-lib-plymouth.script | 1 | ||||
-rw-r--r-- | src/plugins/splash/script/script-scan.c | 4 |
9 files changed, 88 insertions, 1 deletions
diff --git a/src/libply-splash-core/ply-boot-splash-plugin.h b/src/libply-splash-core/ply-boot-splash-plugin.h index 69f34e15..caa94f5a 100644 --- a/src/libply-splash-core/ply-boot-splash-plugin.h +++ b/src/libply-splash-core/ply-boot-splash-plugin.h @@ -99,6 +99,9 @@ typedef struct const char *prompt, const char *entry_text, bool is_secret); + bool (*validate_input) (ply_boot_splash_plugin_t *plugin, + const char *entry_text, + const char *add_text); } ply_boot_splash_plugin_interface_t; #endif /* PLY_BOOT_SPLASH_PLUGIN_H */ diff --git a/src/libply-splash-core/ply-boot-splash.c b/src/libply-splash-core/ply-boot-splash.c index d5cbf1fa..3c1e0dfb 100644 --- a/src/libply-splash-core/ply-boot-splash.c +++ b/src/libply-splash-core/ply-boot-splash.c @@ -652,6 +652,18 @@ void ply_boot_splash_display_prompt (ply_boot_splash_t *splash, splash->plugin_interface->display_prompt (splash->plugin, prompt, entry_text, is_secret); } +bool ply_boot_splash_validate_input (ply_boot_splash_t *splash, + const char *entry_text, + const char *add_text) +{ + bool input_valid = true; + assert (splash != NULL); + assert (splash->plugin_interface != NULL); + assert (splash->plugin != NULL); + if (splash->plugin_interface->validate_input != NULL) + input_valid = splash->plugin_interface->validate_input (splash->plugin, entry_text, add_text); + return input_valid; +} void diff --git a/src/libply-splash-core/ply-boot-splash.h b/src/libply-splash-core/ply-boot-splash.h index 1bb0c6ba..3ede9119 100644 --- a/src/libply-splash-core/ply-boot-splash.h +++ b/src/libply-splash-core/ply-boot-splash.h @@ -86,6 +86,9 @@ void ply_boot_splash_display_prompt (ply_boot_splash_t *splash, const char *prompt, const char *entry_text, bool is_secret); +bool ply_boot_splash_validate_input (ply_boot_splash_t *splash, + const char *entry_text, + const char *add_text); void ply_boot_splash_attach_to_event_loop (ply_boot_splash_t *splash, ply_event_loop_t *loop); void ply_boot_splash_attach_progress (ply_boot_splash_t *splash, @@ -1445,6 +1445,18 @@ start_boot_server (state_t *state) return server; } +static bool +validate_input (state_t *state, + const char *entry_text, + const char *add_text) +{ + bool input_valid; + if (!state->boot_splash) + return true; + input_valid = ply_boot_splash_validate_input (state->boot_splash, entry_text, add_text); + return input_valid; +} + static void update_display (state_t *state) @@ -1506,7 +1518,8 @@ static void on_escape_pressed (state_t *state) { ply_trace ("escape key pressed"); - toggle_between_splash_and_details (state); + if (validate_input (state, "", "\e")) + toggle_between_splash_and_details (state); } static void @@ -1518,6 +1531,8 @@ on_keyboard_input (state_t *state, node = ply_list_get_first_node (state->entry_triggers); if (node) { /* \x3 (ETX) is Ctrl+C and \x4 (EOT) is Ctrl+D */ + if (!validate_input (state, ply_buffer_get_bytes (state->entry_buffer), keyboard_input)) + return; if (character_size == 1 && (keyboard_input[0] == '\x3' || keyboard_input[0] == '\x4')) { ply_entry_trigger_t *entry_trigger = ply_list_node_get_data (node); ply_trigger_pull (entry_trigger->trigger, "\x3"); @@ -1583,6 +1598,8 @@ on_enter (state_t *state, if (node) { ply_entry_trigger_t *entry_trigger = ply_list_node_get_data (node); const char *reply_text = ply_buffer_get_bytes (state->entry_buffer); + if (!validate_input (state, reply_text, "\n")) + return; ply_trigger_pull (entry_trigger->trigger, reply_text); ply_buffer_clear (state->entry_buffer); ply_list_remove_node (state->entry_triggers, node); diff --git a/src/plugins/splash/script/plugin.c b/src/plugins/splash/script/plugin.c index a55b9c20..05065df8 100644 --- a/src/plugins/splash/script/plugin.c +++ b/src/plugins/splash/script/plugin.c @@ -509,6 +509,17 @@ display_question (ply_boot_splash_plugin_t *plugin, unpause_displays (plugin); } +static bool +validate_input (ply_boot_splash_plugin_t *plugin, + const char *entry_text, + const char *add_text) +{ + return script_lib_plymouth_on_validate_input (plugin->script_state, + plugin->script_plymouth_lib, + entry_text, + add_text); +} + static void display_prompt (ply_boot_splash_plugin_t *plugin, const char *prompt, @@ -570,6 +581,7 @@ ply_boot_splash_plugin_get_interface (void) .display_prompt = display_prompt, .display_message = display_message, .hide_message = hide_message, + .validate_input = validate_input, }; return &plugin_interface; diff --git a/src/plugins/splash/script/script-lib-plymouth.c b/src/plugins/splash/script/script-lib-plymouth.c index 6bef52a8..6be7199e 100644 --- a/src/plugins/splash/script/script-lib-plymouth.c +++ b/src/plugins/splash/script/script-lib-plymouth.c @@ -105,6 +105,7 @@ script_lib_plymouth_data_t *script_lib_plymouth_setup (script_state_t *st data->script_display_password_func = script_obj_new_null (); data->script_display_question_func = script_obj_new_null (); data->script_display_prompt_func = script_obj_new_null (); + data->script_validate_input_func = script_obj_new_null (); data->script_display_message_func = script_obj_new_null (); data->script_hide_message_func = script_obj_new_null (); data->script_quit_func = script_obj_new_null (); @@ -174,6 +175,12 @@ script_lib_plymouth_data_t *script_lib_plymouth_setup (script_state_t *st "function", NULL); script_add_native_function (plymouth_hash, + "SetValidateInputFunction", + plymouth_set_function, + &data->script_validate_input_func, + "function", + NULL); + script_add_native_function (plymouth_hash, "SetDisplayMessageFunction", plymouth_set_function, &data->script_display_message_func, @@ -223,6 +230,7 @@ void script_lib_plymouth_destroy (script_lib_plymouth_data_t *data) script_obj_unref (data->script_display_password_func); script_obj_unref (data->script_display_question_func); script_obj_unref (data->script_display_prompt_func); + script_obj_unref (data->script_validate_input_func); script_obj_unref (data->script_display_message_func); script_obj_unref (data->script_hide_message_func); script_obj_unref (data->script_quit_func); @@ -373,6 +381,28 @@ void script_lib_plymouth_on_display_prompt (script_state_t *state, script_obj_unref (ret.object); } +bool script_lib_plymouth_on_validate_input (script_state_t *state, + script_lib_plymouth_data_t *data, + const char *entry_text, + const char *add_text) +{ + bool input_valid; + script_obj_t *entry_text_obj = script_obj_new_string (entry_text); + script_obj_t *add_text_obj = script_obj_new_string (add_text); + script_return_t ret = script_execute_object (state, + data->script_validate_input_func, + NULL, + entry_text_obj, + add_text_obj, + NULL); + + script_obj_unref (add_text_obj); + script_obj_unref (entry_text_obj); + input_valid = script_obj_as_bool (ret.object); + script_obj_unref (ret.object); + return input_valid; +} + void script_lib_plymouth_on_display_message (script_state_t *state, script_lib_plymouth_data_t *data, const char *message) diff --git a/src/plugins/splash/script/script-lib-plymouth.h b/src/plugins/splash/script/script-lib-plymouth.h index 5a7f38a8..7fe51351 100644 --- a/src/plugins/splash/script/script-lib-plymouth.h +++ b/src/plugins/splash/script/script-lib-plymouth.h @@ -37,6 +37,7 @@ typedef struct script_obj_t *script_display_password_func; script_obj_t *script_display_question_func; script_obj_t *script_display_prompt_func; + script_obj_t *script_validate_input_func; script_obj_t *script_display_message_func; script_obj_t *script_hide_message_func; script_obj_t *script_quit_func; @@ -79,6 +80,10 @@ void script_lib_plymouth_on_display_prompt (script_state_t *state, const char *prompt, const char *entry_text, bool is_secret); +bool script_lib_plymouth_on_validate_input (script_state_t *state, + script_lib_plymouth_data_t *data, + const char *entry_text, + const char *add_text); void script_lib_plymouth_on_display_message (script_state_t *state, script_lib_plymouth_data_t *data, const char *new_message); diff --git a/src/plugins/splash/script/script-lib-plymouth.script b/src/plugins/splash/script/script-lib-plymouth.script index 00fb60d4..13730f99 100644 --- a/src/plugins/splash/script/script-lib-plymouth.script +++ b/src/plugins/splash/script/script-lib-plymouth.script @@ -9,6 +9,7 @@ PlymouthSetUpdateStatusFunction = Plymouth.SetUpdateStatusFunction; PlymouthSetDisplayNormalFunction = Plymouth.SetDisplayNormalFunction; PlymouthSetDisplayPasswordFunction = Plymouth.SetDisplayPasswordFunction; PlymouthSetDisplayQuestionFunction = Plymouth.SetDisplayQuestionFunction; +PlymouthSetValidateInputFunction = Plymouth.SetValidateInputFunction; PlymouthSetMessageFunction = Plymouth.SetMessageFunction; PlymouthSetQuitFunction = Plymouth.SetQuitFunction; PlymouthGetMode = Plymouth.GetMode; diff --git a/src/plugins/splash/script/script-scan.c b/src/plugins/splash/script/script-scan.c index c27ffcfc..635f912c 100644 --- a/src/plugins/splash/script/script-scan.c +++ b/src/plugins/splash/script/script-scan.c @@ -253,6 +253,10 @@ void script_scan_read_next_token (script_scan_t *scan, curchar = '\n'; break; + case 'e': + curchar = '\e'; + break; + case '0': curchar = '\0'; break; |