]> git.ozlabs.org Git - petitboot/blobdiff - ui/ncurses/nc-config.c
ui/ncurses: Add nc-auth and authenticate when required.
[petitboot] / ui / ncurses / nc-config.c
index 1bc77e8ec44750b6385388fa902e3a83b552c5a6..4685fa5d0db1988661503115163ddf30c9a7a552 100644 (file)
 #include <log/log.h>
 #include <i18n/i18n.h>
 
+#include "ui/common/discover-client.h"
 #include "nc-cui.h"
 #include "nc-config.h"
 #include "nc-widgets.h"
 
-#define N_FIELDS       44
+#define N_FIELDS       49
 
 extern struct help_text config_help_text;
 
@@ -51,7 +52,6 @@ struct config_screen {
 
        bool                    exit;
        bool                    show_help;
-       bool                    show_subset;
        bool                    need_redraw;
        bool                    need_update;
 
@@ -84,7 +84,7 @@ struct config_screen {
 
                struct nc_widget_label          *ipmi_type_l;
                struct nc_widget_label          *ipmi_clear_l;
-               struct nc_widget_checkbox       *ipmi_clear_cb;
+               struct nc_widget_button         *ipmi_clear_b;
 
                struct nc_widget_label          *network_l;
                struct nc_widget_select         *network_f;
@@ -106,6 +106,10 @@ struct config_screen {
                struct nc_widget_textbox        *dns_f;
                struct nc_widget_label          *dns_dhcp_help_l;
                struct nc_widget_label          *dns_help_l;
+               struct nc_widget_label          *http_proxy_l;
+               struct nc_widget_textbox        *http_proxy_f;
+               struct nc_widget_label          *https_proxy_l;
+               struct nc_widget_textbox        *https_proxy_f;
 
                struct nc_widget_label          *allow_write_l;
                struct nc_widget_select         *allow_write_f;
@@ -114,6 +118,8 @@ struct config_screen {
                struct nc_widget_label          *manual_console_l;
                struct nc_widget_label          *current_console_l;
 
+               struct nc_widget_button         *update_password_l;
+
                struct nc_widget_label          *net_override_l;
                struct nc_widget_label          *safe_mode;
                struct nc_widget_button         *ok_b;
@@ -171,7 +177,7 @@ static void config_screen_process_key(struct nc_scr *scr, int key)
                cui_show_help(screen->cui, _("System Configuration"),
                                &config_help_text);
 
-       } else if (handled && !screen->show_subset) {
+       } else if (handled && (screen->cui->current == scr)) {
                pad_refresh(screen);
        }
 }
@@ -199,7 +205,7 @@ static int screen_process_form(struct config_screen *screen)
        const struct system_info *sysinfo = screen->cui->sysinfo;
        enum net_conf_type net_conf_type;
        struct interface_config *iface;
-       bool allow_write, autoboot;
+       bool allow_write;
        char *str, *end;
        struct config *config;
        int i, n_boot_opts, rc;
@@ -214,8 +220,8 @@ static int screen_process_form(struct config_screen *screen)
        n_boot_opts = widget_subset_get_order(config, &order,
                                              screen->widgets.boot_order_f);
 
-       autoboot = widget_select_get_value(screen->widgets.autoboot_f);
-       config->autoboot_enabled = autoboot && n_boot_opts;
+       config->autoboot_enabled = widget_select_get_value(
+                                               screen->widgets.autoboot_f);
 
        config->n_autoboot_opts = n_boot_opts;
        config->autoboot_opts = talloc_array(config, struct autoboot_option,
@@ -252,11 +258,6 @@ static int screen_process_form(struct config_screen *screen)
                        config->autoboot_timeout_sec = x;
        }
 
-       if (screen->ipmi_override)
-               if (widget_checkbox_get_value(screen->widgets.ipmi_clear_cb))
-                       config->ipmi_bootdev = IPMI_BOOTDEV_INVALID;
-
-
        net_conf_type = widget_select_get_value(screen->widgets.network_f);
 
        /* if we don't have any network interfaces, prevent per-interface
@@ -335,6 +336,13 @@ static int screen_process_form(struct config_screen *screen)
                }
        }
 
+       talloc_free(config->http_proxy);
+       talloc_free(config->https_proxy);
+       str = widget_textbox_get_value(screen->widgets.http_proxy_f);
+       config->http_proxy = talloc_strdup(config, str);
+       str = widget_textbox_get_value(screen->widgets.https_proxy_f);
+       config->https_proxy = talloc_strdup(config, str);
+
        allow_write = widget_select_get_value(screen->widgets.allow_write_f);
        if (allow_write != config->allow_writes)
                config->allow_writes = allow_write;
@@ -364,15 +372,39 @@ static int screen_process_form(struct config_screen *screen)
        return 0;
 }
 
+static void config_screen_config_cb(struct nc_scr *scr)
+{
+       struct config_screen *screen = config_screen_from_scr(scr);
+
+       if (!screen_process_form(screen))
+               screen->exit = true;
+}
+
+#ifdef CRYPT_SUPPORT
+static void password_click(void *arg)
+{
+       struct config_screen *screen = arg;
+
+       screen->need_update = true;
+       cui_show_auth(screen->cui, screen->scr.main_ncw, true, NULL);
+}
+#endif
+
 static void ok_click(void *arg)
 {
        struct config_screen *screen = arg;
-       if (screen_process_form(screen))
-               /* errors are written to the status line, so we'll need
-                * to refresh */
-               wrefresh(screen->scr.main_ncw);
-       else
-               screen->exit = true;
+
+       if (discover_client_authenticated(screen->cui->client)) {
+               if (screen_process_form(screen))
+                       /* errors are written to the status line, so we'll need
+                        * to refresh */
+                       wrefresh(screen->scr.main_ncw);
+               else
+                       screen->exit = true;
+       } else {
+               cui_show_auth(screen->cui, screen->scr.main_ncw, false,
+                               config_screen_config_cb);
+       }
 }
 
 static void help_click(void *arg)
@@ -387,6 +419,26 @@ static void cancel_click(void *arg)
        screen->exit = true;
 }
 
+static void ipmi_clear_click(void *arg)
+{
+       struct config_screen *screen = arg;
+       struct config *config;
+       int rc;
+
+       config = config_copy(screen, screen->cui->config);
+       config->ipmi_bootdev = IPMI_BOOTDEV_INVALID;
+       config->safe_mode = false;
+
+       rc = cui_send_config(screen->cui, config);
+       talloc_free(config);
+
+       if (rc)
+               pb_log("cui_send_config failed!\n");
+       else
+               pb_debug("config sent!\n");
+       screen->exit = true;
+}
+
 static int layout_pair(struct config_screen *screen, int y,
                struct nc_widget_label *label,
                struct nc_widget *field)
@@ -486,7 +538,7 @@ static void config_screen_layout_widgets(struct config_screen *screen)
                y += 1;
 
                wl = widget_label_base(screen->widgets.ipmi_clear_l);
-               wf = widget_checkbox_base(screen->widgets.ipmi_clear_cb);
+               wf = widget_button_base(screen->widgets.ipmi_clear_b);
                widget_set_visible(wl, true);
                widget_set_visible(wf, true);
                widget_move(wl, y, screen->label_x);
@@ -585,6 +637,13 @@ static void config_screen_layout_widgets(struct config_screen *screen)
                y += 1;
        }
 
+       wf = widget_textbox_base(screen->widgets.http_proxy_f);
+       layout_pair(screen, y, screen->widgets.http_proxy_l, wf);
+       y++;
+       wf = widget_textbox_base(screen->widgets.https_proxy_f);
+       layout_pair(screen, y, screen->widgets.https_proxy_l, wf);
+       y++;
+
        y += 1;
 
        layout_pair(screen, y, screen->widgets.allow_write_l,
@@ -617,6 +676,12 @@ static void config_screen_layout_widgets(struct config_screen *screen)
                                        screen->widgets.current_console_l), false);
        }
 
+#ifdef CRYPT_SUPPORT
+       widget_move(widget_button_base(screen->widgets.update_password_l),
+                       y, screen->field_x);
+       y += 2;
+#endif
+
        if (screen->net_override) {
                widget_move(widget_label_base(screen->widgets.net_override_l),
                                y, screen->label_x);
@@ -672,7 +737,6 @@ static void config_screen_add_device(void *arg)
 {
        struct config_screen *screen = arg;
 
-       screen->show_subset = true;
        cui_show_subset(screen->cui, _("Select a boot device to add"),
                        screen->widgets.boot_order_f);
 }
@@ -913,14 +977,16 @@ static void config_screen_setup_widgets(struct config_screen *screen,
                label = talloc_asprintf(screen,
                                _("%s IPMI boot option: %s"),
                                config->ipmi_bootdev_persistent ?
-                               "Persistent" : "Temporary",
+                               _("Persistent") : _("Temporary"),
                                ipmi_bootdev_display_name(config->ipmi_bootdev));
                screen->widgets.ipmi_type_l = widget_new_label(set, 0, 0,
                                                        label);
                screen->widgets.ipmi_clear_l = widget_new_label(set, 0, 0,
                                                        _("Clear option:"));
-               screen->widgets.ipmi_clear_cb = widget_new_checkbox(set, 0, 0,
-                                                       false);
+               screen->widgets.ipmi_clear_b = widget_new_button(set, 0, 0,
+                               strncols(_("Clear IPMI override now")) + 10,
+                               _("Clear IPMI override now"),
+                               ipmi_clear_click, screen);
                screen->ipmi_override = true;
        }
 
@@ -994,8 +1060,8 @@ static void config_screen_setup_widgets(struct config_screen *screen,
 
        widget_textbox_set_fixed_size(screen->widgets.ip_addr_f);
        widget_textbox_set_fixed_size(screen->widgets.ip_mask_f);
-       widget_textbox_set_validator_ipv4(screen->widgets.ip_addr_f);
-       widget_textbox_set_validator_integer(screen->widgets.ip_mask_f, 1, 31);
+       widget_textbox_set_validator_ip(screen->widgets.ip_addr_f);
+       widget_textbox_set_validator_integer(screen->widgets.ip_mask_f, 1, 127);
 
        screen->widgets.gateway_l = widget_new_label(set, 0, 0, _("Gateway:"));
        screen->widgets.gateway_f = widget_new_textbox(set, 0, 0, 16, gw);
@@ -1003,10 +1069,11 @@ static void config_screen_setup_widgets(struct config_screen *screen,
                widget_new_label(set, 0, 0, _("(eg. 192.168.0.1)"));
 
        widget_textbox_set_fixed_size(screen->widgets.gateway_f);
-       widget_textbox_set_validator_ipv4(screen->widgets.gateway_f);
+       widget_textbox_set_validator_ip(screen->widgets.gateway_f);
 
        screen->widgets.url_l = widget_new_label(set, 0, 0, _("URL:"));
        screen->widgets.url_f = widget_new_textbox(set, 0, 0, 32, url);
+       widget_textbox_set_validator_url(screen->widgets.url_f);
        screen->widgets.url_help_l =
                widget_new_label(set, 0, 0, _("(eg. tftp://)"));
 
@@ -1023,11 +1090,20 @@ static void config_screen_setup_widgets(struct config_screen *screen,
        screen->widgets.dns_help_l =
                widget_new_label(set, 0, 0, _("(eg. 192.168.0.2)"));
 
-       widget_textbox_set_validator_ipv4_multi(screen->widgets.dns_f);
+       widget_textbox_set_validator_ip_multi(screen->widgets.dns_f);
 
        screen->widgets.dns_dhcp_help_l = widget_new_label(set, 0, 0,
                        _("(if not provided by DHCP server)"));
 
+       screen->widgets.http_proxy_l = widget_new_label(set, 0, 0,
+                                       _("HTTP Proxy:"));
+       screen->widgets.http_proxy_f = widget_new_textbox(set, 0, 0, 32,
+                                               config->http_proxy);
+       screen->widgets.https_proxy_l = widget_new_label(set, 0, 0,
+                                       _("HTTPS Proxy:"));
+       screen->widgets.https_proxy_f = widget_new_textbox(set, 0, 0, 32,
+                                               config->https_proxy);
+
        if (config->safe_mode)
                screen->widgets.safe_mode = widget_new_label(set, 0, 0,
                         _("Selecting 'OK' will exit safe mode"));
@@ -1068,6 +1144,11 @@ static void config_screen_setup_widgets(struct config_screen *screen,
                                ttyname(STDIN_FILENO));
        screen->widgets.current_console_l = widget_new_label(set, 0 , 0, tty);
 
+#ifdef CRYPT_SUPPORT
+       screen->widgets.update_password_l = widget_new_button(set, 0, 0, 30,
+                       _("Update system password"), password_click, screen);
+#endif
+
        screen->widgets.ok_b = widget_new_button(set, 0, 0, 10, _("OK"),
                        ok_click, screen);
        screen->widgets.help_b = widget_new_button(set, 0, 0, 10, _("Help"),
@@ -1167,7 +1248,12 @@ void config_screen_update(struct config_screen *screen,
 static int config_screen_post(struct nc_scr *scr)
 {
        struct config_screen *screen = config_screen_from_scr(scr);
-       screen->show_subset = false;
+
+       /* We may have been posted after an auth action completed */
+       if (screen->exit) {
+               screen->on_exit(screen->cui);
+               return 0;
+       }
 
        if (screen->need_update) {
                config_screen_draw(screen, screen->cui->config,
@@ -1217,7 +1303,6 @@ struct config_screen *config_screen_init(struct cui *cui,
        screen->field_x = 17;
 
        screen->ipmi_override = false;
-       screen->show_subset = false;
 
        screen->scr.frame.ltitle = talloc_strdup(screen,
                        _("Petitboot System Configuration"));