diff options
| author | Mattias Andrée <m@maandree.se> | 2025-12-19 16:44:15 +0100 |
|---|---|---|
| committer | Mattias Andrée <m@maandree.se> | 2025-12-19 16:44:15 +0100 |
| commit | d529707547ae73fdd19221a43fdd0f7438e21b92 (patch) | |
| tree | 8810013afa97f780a603cdeb4d025fcbf4374c94 /gasroot-gtk3.c | |
| download | gasroot-d529707547ae73fdd19221a43fdd0f7438e21b92.tar.gz gasroot-d529707547ae73fdd19221a43fdd0f7438e21b92.tar.bz2 gasroot-d529707547ae73fdd19221a43fdd0f7438e21b92.tar.xz | |
First commit
Signed-off-by: Mattias Andrée <m@maandree.se>
Diffstat (limited to '')
| -rw-r--r-- | gasroot-gtk3.c | 191 |
1 files changed, 191 insertions, 0 deletions
diff --git a/gasroot-gtk3.c b/gasroot-gtk3.c new file mode 100644 index 0000000..e889ec1 --- /dev/null +++ b/gasroot-gtk3.c @@ -0,0 +1,191 @@ +/* See LICENSE file for copyright and license details. */ +#include "common.h" +#include <gtk/gtk.h> + + +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; +} |
