diff options
author | Michael Brown <mcb30@ipxe.org> | 2024-06-20 15:42:48 -0700 |
---|---|---|
committer | Michael Brown <mcb30@ipxe.org> | 2024-06-21 09:45:44 -0700 |
commit | 162cc51b6db2caa888e2fb834511d7e4af7e0bfe (patch) | |
tree | 81f45366c27fa7da8a440e65ac8723dca912371b | |
parent | f417f0b6a56956137d75c77f344d798f6b30a27c (diff) | |
download | ipxe-162cc51b6db2caa888e2fb834511d7e4af7e0bfe.tar.gz |
[form] Reimplement the "login" user interface
Rewrite the code implementing the "login" user interface to use a
predefined interactive form. The command "login" then becomes roughly
equivalent to:
#!ipxe
form
item username Username
item --secret password Password
present
with the result that login form customisations (e.g. to add a Windows
domain name) may be implemented within the scripting language.
Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r-- | src/hci/tui/login_ui.c | 92 |
1 files changed, 31 insertions, 61 deletions
diff --git a/src/hci/tui/login_ui.c b/src/hci/tui/login_ui.c index 9c5148865..02552f0d2 100644 --- a/src/hci/tui/login_ui.c +++ b/src/hci/tui/login_ui.c @@ -29,72 +29,42 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); * */ -#include <string.h> -#include <stdlib.h> -#include <errno.h> -#include <curses.h> -#include <ipxe/console.h> -#include <ipxe/settings.h> -#include <ipxe/label.h> -#include <ipxe/editbox.h> -#include <ipxe/keys.h> -#include <ipxe/ansicol.h> +#include <ipxe/dynui.h> #include <ipxe/login_ui.h> -/* Screen layout */ -#define USERNAME_LABEL_ROW ( ( LINES / 2U ) - 4U ) -#define USERNAME_ROW ( ( LINES / 2U ) - 2U ) -#define PASSWORD_LABEL_ROW ( ( LINES / 2U ) + 2U ) -#define PASSWORD_ROW ( ( LINES / 2U ) + 4U ) -#define WIDGET_COL ( ( COLS / 2U ) - 10U ) -#define WIDGET_WIDTH 20U +static struct dynamic_item username; +static struct dynamic_item password; -int login_ui ( void ) { - char *username; - char *password; - struct { - struct widgets widgets; - struct label username_label; - struct label password_label; - struct edit_box username_box; - struct edit_box password_box; - } widgets; - int rc; - - /* Fetch current setting values */ - fetchf_setting_copy ( NULL, &username_setting, NULL, NULL, &username ); - fetchf_setting_copy ( NULL, &password_setting, NULL, NULL, &password ); +static struct dynamic_ui login = { + .items = { + .prev = &password.list, + .next = &username.list, + }, + .count = 2, +}; - /* Construct user interface */ - memset ( &widgets, 0, sizeof ( widgets ) ); - init_widgets ( &widgets.widgets ); - init_label ( &widgets.username_label, USERNAME_LABEL_ROW, WIDGET_COL, - WIDGET_WIDTH, "Username" ); - init_label ( &widgets.password_label, PASSWORD_LABEL_ROW, WIDGET_COL, - WIDGET_WIDTH, "Password" ); - init_editbox ( &widgets.username_box, USERNAME_ROW, WIDGET_COL, - WIDGET_WIDTH, 0, &username ); - init_editbox ( &widgets.password_box, PASSWORD_ROW, WIDGET_COL, - WIDGET_WIDTH, WIDGET_SECRET, &password ); - add_widget ( &widgets.widgets, &widgets.username_label.widget ); - add_widget ( &widgets.widgets, &widgets.password_label.widget ); - add_widget ( &widgets.widgets, &widgets.username_box.widget ); - add_widget ( &widgets.widgets, &widgets.password_box.widget ); +static struct dynamic_item username = { + .list = { + .prev = &login.items, + .next = &password.list, + }, + .name = "username", + .text = "Username", + .index = 0, +}; - /* Present user interface */ - if ( ( rc = widget_ui ( &widgets.widgets ) ) != 0 ) - goto err_ui; +static struct dynamic_item password = { + .list = { + .prev = &username.list, + .next = &login.items, + }, + .name = "password", + .text = "Password", + .index = 1, + .flags = DYNUI_SECRET, +}; - /* Store settings on successful completion */ - if ( ( rc = storef_setting ( NULL, &username_setting, username ) ) !=0) - goto err_store_username; - if ( ( rc = storef_setting ( NULL, &password_setting, password ) ) !=0) - goto err_store_password; +int login_ui ( void ) { - err_store_username: - err_store_password: - err_ui: - free ( username ); - free ( password ); - return rc; + return show_form ( &login ); } |