| /* |
| * 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 <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/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 |
| |
| 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 ); |
| |
| /* 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 ); |
| |
| /* Present user interface */ |
| if ( ( rc = widget_ui ( &widgets.widgets ) ) != 0 ) |
| goto err_ui; |
| |
| /* 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; |
| |
| err_store_username: |
| err_store_password: |
| err_ui: |
| free ( username ); |
| free ( password ); |
| return rc; |
| } |