summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRay Strode <halfline@gmail.com>2022-03-29 17:49:52 +0000
committerRay Strode <halfline@gmail.com>2022-03-29 17:49:52 +0000
commite40a59d2c2c2e7d0cde9c5b2c714ec37d1d6f785 (patch)
tree3804c59cf865d93d80bcb5f1c6eb26bb2629d3d3
parent88c54ffbeea73b5fa40ac90b3b0a1c8e68d25c73 (diff)
parent5d1b49c601a085120e834c1e9134593318465eec (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.h3
-rw-r--r--src/libply-splash-core/ply-boot-splash.c12
-rw-r--r--src/libply-splash-core/ply-boot-splash.h3
-rw-r--r--src/main.c19
-rw-r--r--src/plugins/splash/script/plugin.c12
-rw-r--r--src/plugins/splash/script/script-lib-plymouth.c30
-rw-r--r--src/plugins/splash/script/script-lib-plymouth.h5
-rw-r--r--src/plugins/splash/script/script-lib-plymouth.script1
-rw-r--r--src/plugins/splash/script/script-scan.c4
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,
diff --git a/src/main.c b/src/main.c
index 255a86a8..daf25243 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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;