aboutsummaryrefslogtreecommitdiffstats
path: root/gasroot-gtk3.c
diff options
context:
space:
mode:
authorMattias Andrée <m@maandree.se>2025-12-19 16:44:15 +0100
committerMattias Andrée <m@maandree.se>2025-12-19 16:44:15 +0100
commitd529707547ae73fdd19221a43fdd0f7438e21b92 (patch)
tree8810013afa97f780a603cdeb4d025fcbf4374c94 /gasroot-gtk3.c
downloadgasroot-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-gtk3.c')
-rw-r--r--gasroot-gtk3.c191
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;
+}