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-gtk2.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 'gasroot-gtk2.c')
| -rw-r--r-- | gasroot-gtk2.c | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/gasroot-gtk2.c b/gasroot-gtk2.c new file mode 100644 index 0000000..10783a9 --- /dev/null +++ b/gasroot-gtk2.c @@ -0,0 +1,180 @@ +/* See LICENSE file for copyright and license details. */ +#include "common.h" +#if defined(__GNUC__) +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wdeprecated-declarations" +# pragma GCC diagnostic ignored "-Wstrict-prototypes" +#endif +#include <gtk/gtk.h> +#if defined(__GNUC__) +# pragma GCC diagnostic pop +#endif + + +static GtkWidget *passphrase_field; +static GtkWidget *dialog; + + +static void +set_enable(int enabled) +{ + GtkWidget *action_area; + GList *children, *e; + + gtk_widget_set_sensitive(passphrase_field, enabled); + + action_area = gtk_dialog_get_action_area(GTK_DIALOG(dialog)); + children = gtk_container_get_children(GTK_CONTAINER(action_area)); + + for (e = children; e; e = e->next) + gtk_widget_set_sensitive(GTK_WIDGET(e->data), enabled); + + g_list_free(children); + +} + + +static int +do_check_passphrase(void *user_data) +{ + char *passphrase = user_data; + int ok; + + ok = check_passphrase(passphrase, NULL); + wipe(passphrase); + free(passphrase); + if (ok) { + gtk_widget_destroy(GTK_WIDGET(dialog)); + gtk_main_quit(); + exit(0); + } + set_enable(1); + gtk_widget_grab_focus(passphrase_field); + return 0; /* remove from idle */ +} + + +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), ""); + set_enable(0); + g_idle_add(&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, + GTK_STOCK_OK, GTK_RESPONSE_OK, + GTK_STOCK_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_hbox_new(FALSE, 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_misc_set_alignment(GTK_MISC(image), 0.0f, 0.0f); + gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0); + + vbox = gtk_vbox_new(FALSE, 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_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); + 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_misc_set_alignment(GTK_MISC(label), 0.0f, 0.5f); + 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_entry_set_editable(GTK_ENTRY(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; +} |
