]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
core, script: add support for validating input characters in plugins
authorTimo Teräs <timo.teras@solidboot.com>
Tue, 1 Sep 2020 09:51:43 +0000 (12:51 +0300)
committerTimo Teräs <timo.teras@iki.fi>
Tue, 29 Mar 2022 14:28:00 +0000 (17:28 +0300)
This adds also '\e' to be parsed as escape character in script strings.

Together these allow possibility to create scripts that allow only
numeric PINs, and prevent switching to text mode.

src/libply-splash-core/ply-boot-splash-plugin.h
src/libply-splash-core/ply-boot-splash.c
src/libply-splash-core/ply-boot-splash.h
src/main.c
src/plugins/splash/script/plugin.c
src/plugins/splash/script/script-lib-plymouth.c
src/plugins/splash/script/script-lib-plymouth.h
src/plugins/splash/script/script-lib-plymouth.script
src/plugins/splash/script/script-scan.c

index 69f34e15a33c8a07c41162e275bbd057e35729da..caa94f5a57a592b82269b17319ca9607ab301c5a 100644 (file)
@@ -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 */
index d5cbf1faf454fa7ee9589af1e20aacba848cf3e8..3c1e0dfb3237e6af5a031de4bd1a2b63a01929b9 100644 (file)
@@ -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
index 1bb0c6ba0110c68ba81ca034eaaf1e35340de079..3ede911942bcbcaf2a4a3e99bc4d825025ca21f6 100644 (file)
@@ -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,
index 255a86a8b22af5c7481aa85890970ae52acde277..daf25243e4c276651410434f762c22a887d60bd2 100644 (file)
@@ -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);
index a55b9c2008d99fe9d5f7418827d1d2353ac285a9..05065df8ed15c39fe45700dc92f65e68f6e70871 100644 (file)
@@ -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;
index 6bef52a888c869ffccfafdd2ca0cab8d748804b2..6be7199e3d7acc5c68d7096c69dd125814e08484 100644 (file)
@@ -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 ();
@@ -173,6 +174,12 @@ script_lib_plymouth_data_t *script_lib_plymouth_setup (script_state_t        *st
                                     &data->script_display_prompt_func,
                                     "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,
@@ -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)
index 5a7f38a8ced75d57d07f2af2b8a6773a275cf9b6..7fe51351e8bc5fcb0f1903893ebef9d634f15349 100644 (file)
@@ -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);
index 00fb60d48f6997229fbd28258659ec3fa97fb566..13730f990a006e2a65717260e0cb350491d20b53 100644 (file)
@@ -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;
index c27ffcfc835db8b4f15a9e1ca539d02d9f820ea0..635f912c8046cc0d1b2af007a77b3a4afe946c9a 100644 (file)
@@ -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;