| /* |
| * 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., 51 Franklin Street, Fifth Floor, Boston, MA |
| * 02110-1301, USA. |
| * |
| * You can also choose to distribute this program under the terms of |
| * the Unmodified Binary Distribution Licence (as given in the file |
| * COPYING.UBDL), provided that you have satisfied its requirements. |
| */ |
| |
| FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); |
| |
| /** @file |
| * |
| * Login UI |
| * |
| */ |
| |
| #include <string.h> |
| #include <errno.h> |
| #include <curses.h> |
| #include <ipxe/console.h> |
| #include <ipxe/settings.h> |
| #include <ipxe/editbox.h> |
| #include <ipxe/keys.h> |
| #include <ipxe/ansicol.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 LABEL_COL ( ( COLS / 2U ) - 4U ) |
| #define EDITBOX_COL ( ( COLS / 2U ) - 10U ) |
| #define EDITBOX_WIDTH 20U |
| |
| 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_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 */ |
| color_set ( CPAIR_NORMAL, NULL ); |
| erase(); |
| attron ( A_BOLD ); |
| mvprintw ( USERNAME_LABEL_ROW, LABEL_COL, "Username:" ); |
| mvprintw ( PASSWORD_LABEL_ROW, LABEL_COL, "Password:" ); |
| attroff ( A_BOLD ); |
| color_set ( CPAIR_EDIT, NULL ); |
| draw_editbox ( &username_box ); |
| draw_editbox ( &password_box ); |
| |
| /* Main loop */ |
| while ( rc == -EINPROGRESS ) { |
| |
| draw_editbox ( current_box ); |
| |
| key = getkey ( 0 ); |
| 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; |
| } |