/* See LICENSE file for copyright and license details. */ #include "common.h" #include static GtkWidget *passphrase_field; static GtkWidget *dialog; static void set_enable(int enabled) { GtkWidget *ok_button, *cancel_button; ok_button = gtk_dialog_get_widget_for_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK); cancel_button = gtk_dialog_get_widget_for_response(GTK_DIALOG(dialog), GTK_RESPONSE_CANCEL); gtk_widget_set_sensitive(ok_button, enabled); gtk_widget_set_sensitive(cancel_button, enabled); gtk_widget_set_sensitive(passphrase_field, enabled); } static void block(void) { set_enable(0); } static int passphrase_ok(void *user_data) { (void) user_data; gtk_widget_destroy(GTK_WIDGET(dialog)); gtk_main_quit(); exit(0); } static int passphrase_nok(void *user_data) { (void) user_data; set_enable(1); gtk_widget_grab_focus(passphrase_field); return 0; /* remove from idle */ } static void * do_check_passphrase(void *user_data) { char *passphrase = user_data; int ok; ok = check_passphrase(passphrase, &block); wipe(passphrase); free(passphrase); g_idle_add(ok ? &passphrase_ok : &passphrase_nok, NULL); return NULL; } static void on_response(GtkDialog *dialog_, int response_id, void *user_data) { char *passphrase; (void) user_data; (void) dialog_; if (response_id != GTK_RESPONSE_OK) { gtk_widget_destroy(GTK_WIDGET(dialog)); exit(EXIT_ERROR); } passphrase = strdup(gtk_entry_get_text(GTK_ENTRY(passphrase_field))); if (!passphrase) { fprintf(stderr, "%s: strdup: %s\n", argv0, strerror(errno)); exit(EXIT_ERROR); } gtk_entry_set_text(GTK_ENTRY(passphrase_field), ""); g_thread_unref(g_thread_new("passphrase check", do_check_passphrase, passphrase)); } int main(int argc, char *argv[]) { GtkWidget *label, *image; GtkWidget *content, *hbox, *vbox; int xargc = 1; char *xargva[] = {argv[0], NULL}; char **xargv = xargva; const char *icon; GtkIconTheme *theme; parse_cmdline(argc, argv); start_gasroot_setuid(argv); g_set_prgname(argv0); g_set_application_name("gasroot"); gtk_init(&xargc, &xargv); dialog = gtk_dialog_new_with_buttons("Password required - gasroot", NULL, 0, "_OK", GTK_RESPONSE_OK, "_Cancel", GTK_RESPONSE_CANCEL, NULL); gtk_container_set_border_width(GTK_CONTAINER(dialog), 8); theme = gtk_icon_theme_get_default(); if (gtk_icon_theme_has_icon(theme, icon = "status/dialog-password")) goto icon_found; if (gtk_icon_theme_has_icon(theme, icon = "dialog-password")) goto icon_found; if (gtk_icon_theme_has_icon(theme, icon = "status/gtk-dialog-authentication")) goto icon_found; if (gtk_icon_theme_has_icon(theme, icon = "gtk-dialog-authentication")) goto icon_found; if (gtk_icon_theme_has_icon(theme, icon = "gasroot")) goto icon_found; if (gtk_icon_theme_has_icon(theme, icon = "apps/gasroot")) goto preferred_icon_found; icon = NULL; if (0) { icon_found: if (gtk_icon_theme_has_icon(theme, "apps/gasroot")) preferred_icon_found: gtk_window_set_icon_name(GTK_WINDOW(dialog), "apps/gasroot"); else gtk_window_set_icon_name(GTK_WINDOW(dialog), icon); } gtk_window_set_wmclass(GTK_WINDOW(dialog), "gasroot", "gasroot"); gtk_window_set_role(GTK_WINDOW(dialog), "password-prompt"); gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK); content = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); if (icon) { hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 16); gtk_box_pack_start(GTK_BOX(content), hbox, FALSE, FALSE, 4); image = gtk_image_new_from_icon_name(icon, GTK_ICON_SIZE_DIALOG); gtk_widget_set_halign(image, GTK_ALIGN_START); gtk_widget_set_valign(image, GTK_ALIGN_START); gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0); vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); } else { vbox = content; } label = gtk_label_new(get_user_and_host("Enter password for ", ":")); gtk_widget_set_halign(label, GTK_ALIGN_START); gtk_widget_set_valign(label, GTK_ALIGN_CENTER); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 2); passphrase_field = gtk_entry_new(); gtk_entry_set_visibility(GTK_ENTRY(passphrase_field), FALSE); gtk_entry_set_activates_default(GTK_ENTRY(passphrase_field), TRUE); gtk_box_pack_start(GTK_BOX(vbox), passphrase_field, FALSE, FALSE, 0); label = gtk_label_new(NULL); gtk_widget_set_size_request(label, 8, 8); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); label = gtk_label_new("Attempting to execute as user 0:"); gtk_widget_set_halign(label, GTK_ALIGN_START); gtk_widget_set_valign(label, GTK_ALIGN_CENTER); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 2); label = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(label), command_str); gtk_editable_set_editable(GTK_EDITABLE(label), FALSE); gtk_entry_set_has_frame(GTK_ENTRY(label), TRUE); gtk_entry_set_max_length(GTK_ENTRY(label), 0); gtk_entry_set_width_chars(GTK_ENTRY(label), 60); gtk_widget_set_tooltip_text(label, command_str); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); g_signal_connect(dialog, "response", G_CALLBACK(on_response), passphrase_field); gtk_widget_show_all(dialog); gtk_main(); return EXIT_ERROR; }