[login] Add "login" command and UI
authorMichael Brown <mcb30@etherboot.org>
Tue, 17 Feb 2009 12:01:47 +0000 (12:01 +0000)
committerMichael Brown <mcb30@etherboot.org>
Tue, 17 Feb 2009 12:02:16 +0000 (12:02 +0000)
src/config/general.h
src/core/config.c
src/hci/commands/login_cmd.c [new file with mode: 0644]
src/hci/tui/login_ui.c [new file with mode: 0644]
src/include/gpxe/errfile.h
src/include/gpxe/login_ui.h [new file with mode: 0644]

index 6454b94..04b5bef 100644 (file)
 #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
index 741579f..bd0d66e 100644 (file)
@@ -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 (file)
index 0000000..e425247
--- /dev/null
@@ -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 (file)
index 0000000..c14a2c0
--- /dev/null
@@ -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;
+}
index a618145..dcfd4e4 100644 (file)
 #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 (file)
index 0000000..d92ba8f
--- /dev/null
@@ -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 */