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.
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 */
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
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,
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)
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
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");
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);
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,
.display_prompt = display_prompt,
.display_message = display_message,
.hide_message = hide_message,
+ .validate_input = validate_input,
};
return &plugin_interface;
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 ();
&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,
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);
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)
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;
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);
PlymouthSetDisplayNormalFunction = Plymouth.SetDisplayNormalFunction;
PlymouthSetDisplayPasswordFunction = Plymouth.SetDisplayPasswordFunction;
PlymouthSetDisplayQuestionFunction = Plymouth.SetDisplayQuestionFunction;
+PlymouthSetValidateInputFunction = Plymouth.SetValidateInputFunction;
PlymouthSetMessageFunction = Plymouth.SetMessageFunction;
PlymouthSetQuitFunction = Plymouth.SetQuitFunction;
PlymouthGetMode = Plymouth.GetMode;
curchar = '\n';
break;
+ case 'e':
+ curchar = '\e';
+ break;
+
case '0':
curchar = '\0';
break;