summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brown2009-02-17 13:01:47 +0100
committerMichael Brown2009-02-17 13:02:16 +0100
commit6de4db5da089c7926f08dd15164676bc8b88f285 (patch)
tree05354d5d97fdeb8e00ad871996985436c19fde89
parent[settings] Allow store_setting() to access the root settings block (diff)
downloadipxe-6de4db5da089c7926f08dd15164676bc8b88f285.tar.gz
ipxe-6de4db5da089c7926f08dd15164676bc8b88f285.tar.xz
ipxe-6de4db5da089c7926f08dd15164676bc8b88f285.zip
[login] Add "login" command and UI
-rw-r--r--src/config/general.h1
-rw-r--r--src/core/config.c3
-rw-r--r--src/hci/commands/login_cmd.c27
-rw-r--r--src/hci/tui/login_ui.c135
-rw-r--r--src/include/gpxe/errfile.h1
-rw-r--r--src/include/gpxe/login_ui.h12
6 files changed, 179 insertions, 0 deletions
diff --git a/src/config/general.h b/src/config/general.h
index 6454b946..04b5bef3 100644
--- a/src/config/general.h
+++ b/src/config/general.h
@@ -100,6 +100,7 @@
#define IMAGE_CMD /* Image management commands */
#define DHCP_CMD /* DHCP management commands */
#define SANBOOT_CMD /* SAN boot commands */
+#define LOGIN_CMD /* Login command */
/*
* Obscure configuration options
diff --git a/src/core/config.c b/src/core/config.c
index 741579fe..bd0d66ec 100644
--- a/src/core/config.c
+++ b/src/core/config.c
@@ -193,6 +193,9 @@ REQUIRE_OBJECT ( dhcp_cmd );
#ifdef SANBOOT_CMD
REQUIRE_OBJECT ( sanboot_cmd );
#endif
+#ifdef LOGIN_CMD
+REQUIRE_OBJECT ( login_cmd );
+#endif
/*
* Drag in miscellaneous objects
diff --git a/src/hci/commands/login_cmd.c b/src/hci/commands/login_cmd.c
new file mode 100644
index 00000000..e425247d
--- /dev/null
+++ b/src/hci/commands/login_cmd.c
@@ -0,0 +1,27 @@
+#include <string.h>
+#include <stdio.h>
+#include <gpxe/command.h>
+#include <gpxe/login_ui.h>
+
+static int login_exec ( int argc, char **argv ) {
+ int rc;
+
+ if ( argc > 1 ) {
+ printf ( "Usage: %s\n"
+ "Prompt for login credentials\n", argv[0] );
+ return 1;
+ }
+
+ if ( ( rc = login_ui() ) != 0 ) {
+ printf ( "Could not set credentials: %s\n",
+ strerror ( rc ) );
+ return 1;
+ }
+
+ return 0;
+}
+
+struct command login_command __command = {
+ .name = "login",
+ .exec = login_exec,
+};
diff --git a/src/hci/tui/login_ui.c b/src/hci/tui/login_ui.c
new file mode 100644
index 00000000..c14a2c03
--- /dev/null
+++ b/src/hci/tui/login_ui.c
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2009 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/** @file
+ *
+ * Login UI
+ *
+ */
+
+#include <string.h>
+#include <errno.h>
+#include <curses.h>
+#include <console.h>
+#include <gpxe/settings.h>
+#include <gpxe/editbox.h>
+#include <gpxe/keys.h>
+#include <gpxe/login_ui.h>
+
+/* Colour pairs */
+#define CPAIR_NORMAL 1
+#define CPAIR_LABEL 2
+#define CPAIR_EDITBOX 3
+
+/* Screen layout */
+#define USERNAME_LABEL_ROW 8
+#define USERNAME_ROW 10
+#define PASSWORD_LABEL_ROW 14
+#define PASSWORD_ROW 16
+#define LABEL_COL 36
+#define EDITBOX_COL 30
+#define EDITBOX_WIDTH 20
+
+int login_ui ( void ) {
+ char username[64];
+ char password[64];
+ struct edit_box username_box;
+ struct edit_box password_box;
+ struct edit_box *current_box = &username_box;
+ int key;
+ int rc = -EINPROGRESS;
+
+ /* Fetch current setting values */
+ fetch_string_setting ( NULL, &username_setting, username,
+ sizeof ( username ) );
+ fetch_string_setting ( NULL, &password_setting, password,
+ sizeof ( password ) );
+
+ /* Initialise UI */
+ initscr();
+ start_color();
+ init_pair ( CPAIR_NORMAL, COLOR_WHITE, COLOR_BLACK );
+ init_pair ( CPAIR_LABEL, COLOR_WHITE, COLOR_BLACK );
+ init_pair ( CPAIR_EDITBOX, COLOR_WHITE, COLOR_BLUE );
+ init_editbox ( &username_box, username, sizeof ( username ), NULL,
+ USERNAME_ROW, EDITBOX_COL, EDITBOX_WIDTH, 0 );
+ init_editbox ( &password_box, password, sizeof ( password ), NULL,
+ PASSWORD_ROW, EDITBOX_COL, EDITBOX_WIDTH,
+ EDITBOX_STARS );
+
+ /* Draw initial UI */
+ erase();
+ color_set ( CPAIR_LABEL, NULL );
+ mvprintw ( USERNAME_LABEL_ROW, LABEL_COL, "Username:" );
+ mvprintw ( PASSWORD_LABEL_ROW, LABEL_COL, "Password:" );
+ color_set ( CPAIR_EDITBOX, NULL );
+ draw_editbox ( &username_box );
+ draw_editbox ( &password_box );
+
+ /* Main loop */
+ while ( rc == -EINPROGRESS ) {
+
+ draw_editbox ( current_box );
+
+ key = getkey();
+ switch ( key ) {
+ case KEY_DOWN:
+ current_box = &password_box;
+ break;
+ case KEY_UP:
+ current_box = &username_box;
+ break;
+ case TAB:
+ current_box = ( ( current_box == &username_box ) ?
+ &password_box : &username_box );
+ break;
+ case KEY_ENTER:
+ if ( current_box == &username_box ) {
+ current_box = &password_box;
+ } else {
+ rc = 0;
+ }
+ break;
+ case CTRL_C:
+ case ESC:
+ rc = -ECANCELED;
+ break;
+ default:
+ edit_editbox ( current_box, key );
+ break;
+ }
+ }
+
+ /* Terminate UI */
+ color_set ( CPAIR_NORMAL, NULL );
+ erase();
+ endwin();
+
+ if ( rc != 0 )
+ return rc;
+
+ /* Store settings */
+ if ( ( rc = store_setting ( NULL, &username_setting, username,
+ strlen ( username ) ) ) != 0 )
+ return rc;
+ if ( ( rc = store_setting ( NULL, &password_setting, password,
+ strlen ( password ) ) ) != 0 )
+ return rc;
+
+ return 0;
+}
diff --git a/src/include/gpxe/errfile.h b/src/include/gpxe/errfile.h
index a6181453..dcfd4e4a 100644
--- a/src/include/gpxe/errfile.h
+++ b/src/include/gpxe/errfile.h
@@ -171,6 +171,7 @@
#define ERRFILE_efi_smbios ( ERRFILE_OTHER | 0x00140000 )
#define ERRFILE_pxemenu ( ERRFILE_OTHER | 0x00150000 )
#define ERRFILE_x509 ( ERRFILE_OTHER | 0x00160000 )
+#define ERRFILE_login_ui ( ERRFILE_OTHER | 0x00170000 )
/** @} */
diff --git a/src/include/gpxe/login_ui.h b/src/include/gpxe/login_ui.h
new file mode 100644
index 00000000..d92ba8f3
--- /dev/null
+++ b/src/include/gpxe/login_ui.h
@@ -0,0 +1,12 @@
+#ifndef _GPXE_LOGIN_UI_H
+#define _GPXE_LOGIN_UI_H
+
+/** @file
+ *
+ * Login UI
+ *
+ */
+
+extern int login_ui ( void );
+
+#endif /* _GPXE_LOGIN_UI_H */