kov changed gksu/trunk/ChangeLog, gksu/trunk/gksu/gksu.c
Gustavo Noronha
kov at costa.debian.org
Fri Aug 18 01:07:32 UTC 2006
Mensagem de log:
bring gksuexec functionality into gksu
-----
Modified: gksu/trunk/ChangeLog
===================================================================
--- gksu/trunk/ChangeLog 2006-08-16 01:37:21 UTC (rev 697)
+++ gksu/trunk/ChangeLog 2006-08-18 01:07:32 UTC (rev 698)
@@ -1,3 +1,10 @@
+2006-08-17 Gustavo Noronha Silva <kov at debian.org>
+
+ * gksu/gksu.c:
+ - imported gksuexec code into the gksu application; now if you call
+ gksu with no commands, it will open the gksuexec UI to request
+ for a command, user and other options;
+
2006-08-09 Gustavo Noronha Silva <kov at debian.org>
* configure.ac:
Modified: gksu/trunk/gksu/gksu.c
===================================================================
--- gksu/trunk/gksu/gksu.c 2006-08-16 01:37:21 UTC (rev 697)
+++ gksu/trunk/gksu/gksu.c 2006-08-18 01:07:32 UTC (rev 698)
@@ -198,6 +198,258 @@
g_key_file_free (desktop);
}
+/* gksuexec */
+void
+response_ok_cb (GtkWidget *w, gpointer data)
+{
+ GtkWidget *dialog = (GtkWidget*)data;
+
+ gtk_dialog_response (GTK_DIALOG(dialog),
+ GTK_RESPONSE_OK);
+}
+
+void
+show_hide_advanced (GtkWidget *button, gpointer data)
+{
+ GtkWidget *parent, *tmp;
+
+ GtkWidget *dialog;
+ GtkWidget *vbox;
+ GtkWidget *label;
+ GtkWidget *check_login;
+ GtkWidget *check_presenv;
+
+ GksuContext *context = (GksuContext*)data;
+ gint response;
+
+ parent = gtk_widget_get_parent (button);
+ while ((tmp = gtk_widget_get_parent (parent)) != NULL)
+ parent = tmp;
+
+ dialog = gtk_dialog_new_with_buttons (_("Advanced options"),
+ GTK_WINDOW(parent),
+ GTK_DIALOG_MODAL,
+ GTK_STOCK_CLOSE,
+ GTK_RESPONSE_CLOSE,
+ NULL);
+ gtk_dialog_set_has_separator (GTK_DIALOG(dialog), FALSE);
+ gtk_container_set_border_width (GTK_CONTAINER(dialog), 4);
+
+ /* vbox points to the dialog's vbox */
+ vbox = GTK_DIALOG(dialog)->vbox;
+ gtk_box_set_spacing (GTK_BOX(vbox), 3);
+
+ /* label */
+ label = gtk_label_new ("");
+ gtk_label_set_markup (GTK_LABEL(label),
+ _("<b>Options to use when changing user</b>"));
+ gtk_box_pack_start (GTK_BOX(vbox), label, TRUE, TRUE, 5);
+ gtk_widget_show (label);
+
+ /* login shell? (--login) */
+ check_login = gtk_check_button_new_with_mnemonic (_("_login shell"));
+ if (gksu_context_get_login_shell (context) == TRUE) /* window may have been opened before */
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(check_login), TRUE);
+ gtk_box_pack_start (GTK_BOX(vbox), check_login, TRUE, TRUE, 0);
+ gtk_widget_show (check_login);
+
+ /* preserve environment (--preserve-env) */
+ check_presenv =
+ gtk_check_button_new_with_mnemonic (_("_preserve environment"));
+ if (gksu_context_get_keep_env (context) == TRUE)
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(check_presenv), TRUE);
+ gtk_box_pack_start (GTK_BOX(vbox), check_presenv, TRUE, TRUE, 0);
+ gtk_widget_show (check_presenv);
+
+ response = gtk_dialog_run (GTK_DIALOG(dialog));
+
+ if (response == GTK_RESPONSE_NONE)
+ return;
+
+ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(check_login)))
+ gksu_context_set_login_shell (context, TRUE);
+ else
+ gksu_context_set_login_shell (context, FALSE);
+
+ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(check_presenv)))
+ gksu_context_set_keep_env (context, TRUE);
+ else
+ gksu_context_set_keep_env (context, FALSE);
+
+ gtk_widget_destroy (dialog);
+}
+
+typedef struct {
+ char *username;
+ uid_t userid;
+} TmpUser;
+
+/*
+ * Comparison function for g_list_sort()
+ */
+static int fill_with_user_list_cmp(gconstpointer a, gconstpointer b)
+{
+ return strcmp(((TmpUser *) a)->username, ((TmpUser *) b)->username);
+}
+
+/*
+ * Fill combobox with an alphabetically sorted list of all users on the system
+ */
+static void
+fill_with_user_list(GtkWidget *combobox)
+{
+ GList *tmp = NULL, *list;
+ TmpUser *tu;
+ struct passwd *pw;
+
+ setpwent();
+
+ /* Get all the users info and store it temporary */
+ while ((pw = getpwent())) {
+ tu = g_new(TmpUser, 1);
+
+ tu->username = g_strdup(pw->pw_name);
+ tu->userid = pw->pw_uid;
+
+ tmp = g_list_prepend(tmp, tu);
+ }
+
+ /* Sort it! */
+ tmp = g_list_sort(tmp, fill_with_user_list_cmp);
+
+ /* Add only the usernames */
+ for (list = tmp; list; list = g_list_next(list)) {
+ tu = list->data;
+
+ gtk_combo_box_append_text (GTK_COMBO_BOX(combobox), tu->username);
+
+ if (!strcmp (tu->username, "root"))
+ gtk_combo_box_set_active (GTK_COMBO_BOX(combobox),
+ g_list_position(tmp, list));
+
+ g_free(tu);
+ }
+
+ g_list_free(tmp);
+ endpwent();
+}
+
+void
+request_command_and_user (GksuContext *context)
+{
+ GtkWidget *dialog;
+ GtkWidget *hbox;
+ GtkWidget *lvbox;
+ GtkWidget *rvbox;
+ GtkWidget *image;
+
+ GtkWidget *label_cmd;
+ GtkWidget *entry_cmd;
+
+ GtkWidget *label_user;
+ GtkWidget *combo_user;
+
+ /* advanced stuff */
+ GtkWidget *advanced_button;
+
+ gint response;
+
+ gchar *tmp = NULL;
+
+ dialog = gtk_dialog_new_with_buttons (_("Run program"), NULL, 0,
+ GTK_STOCK_CANCEL,
+ GTK_RESPONSE_CANCEL,
+ GTK_STOCK_OK,
+ GTK_RESPONSE_OK,
+ NULL);
+ gtk_dialog_set_has_separator (GTK_DIALOG(dialog), FALSE);
+
+ /* horizontal box */
+ hbox = gtk_hbox_new (FALSE, 4);
+ gtk_container_set_border_width (GTK_CONTAINER(hbox), 5);
+ gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox),
+ hbox, TRUE, TRUE, 2);
+
+ /* left vertical box */
+ lvbox = gtk_vbox_new (FALSE, 2);
+ gtk_box_pack_start (GTK_BOX(hbox), lvbox, TRUE, TRUE, 0);
+
+ /* command */
+ label_cmd = gtk_label_new (_("Run:"));
+ gtk_label_set_justify (GTK_LABEL(label_cmd), GTK_JUSTIFY_LEFT);
+ gtk_box_pack_start (GTK_BOX(lvbox), label_cmd, TRUE, TRUE, 0);
+
+ entry_cmd = gtk_entry_new ();
+ gtk_signal_connect (GTK_OBJECT(entry_cmd), "activate",
+ GTK_SIGNAL_FUNC(response_ok_cb),
+ dialog);
+ gtk_box_pack_start (GTK_BOX(lvbox), entry_cmd, TRUE, TRUE, 0);
+
+ /* user name */
+ label_user = gtk_label_new (_("As user:"));
+ gtk_label_set_justify (GTK_LABEL(label_user), GTK_JUSTIFY_LEFT);
+ gtk_box_pack_start (GTK_BOX(lvbox), label_user, TRUE, TRUE, 0);
+ combo_user = gtk_combo_box_new_text ();
+ fill_with_user_list (combo_user);
+
+ gtk_box_pack_start (GTK_BOX(lvbox), combo_user, TRUE, TRUE, 0);
+
+ /* right vertical box */
+ rvbox = gtk_vbox_new (FALSE, 2);
+ gtk_box_pack_start (GTK_BOX(hbox), rvbox, TRUE, TRUE, 0);
+
+ /* image */
+ image = gtk_image_new_from_file (DATA_DIR"/pixmaps/gksu-icon.png");
+ gtk_box_pack_start (GTK_BOX(rvbox), image, TRUE, TRUE, 0);
+
+ /* advanced button */
+ advanced_button = gtk_button_new_with_mnemonic (_("_Advanced"));
+ g_signal_connect (G_OBJECT(advanced_button), "clicked",
+ G_CALLBACK(show_hide_advanced), context);
+ gtk_box_pack_start (GTK_BOX(rvbox), advanced_button, TRUE, FALSE, 0);
+
+ /* let the magic begin! */
+ gtk_widget_show_all (dialog);
+
+ while (TRUE)
+ {
+ response = gtk_dialog_run (GTK_DIALOG(dialog));
+
+ switch (response)
+ {
+ case GTK_RESPONSE_CANCEL:
+ case GTK_RESPONSE_DELETE_EVENT:
+ case GTK_RESPONSE_NONE:
+ exit (0);
+ }
+
+ tmp = gtk_editable_get_chars (GTK_EDITABLE(entry_cmd), 0, -1);
+ if (tmp)
+ {
+ gksu_context_set_command (context, tmp);
+ g_free (tmp);
+ }
+
+ tmp = gtk_combo_box_get_active_text (GTK_COMBO_BOX(combo_user));
+ if (tmp)
+ {
+ gksu_context_set_user (context, tmp);
+ g_free (tmp);
+ }
+
+ if (!strcmp (gksu_context_get_user (context), ""))
+ {
+ gk_dialog (GTK_MESSAGE_ERROR, _("Missing command to run."));
+ }
+ else
+ {
+ gtk_widget_destroy (dialog);
+ break;
+ }
+ }
+}
+/* gksuexec */
+
int
main (int argc, char **argv)
{
@@ -395,40 +647,37 @@
/* now we can begin to care about a command */
if (newargc <= optind)
+ request_command_and_user (context); /* previously known as gksuexec */
+ else
{
- gk_dialog (GTK_MESSAGE_ERROR, _("Missing command to run."));
- return 1;
- }
+ gchar *command = g_strdup (newargv[optind]);
+ gchar *tmp = NULL;
+ gint i = 0;
- {
- gchar *command = g_strdup (newargv[optind]);
- gchar *tmp = NULL;
- gint i = 0;
+ if (!strncmp ("--", command, 2))
+ {
+ optind = optind + 1;
- if (!strncmp ("--", command, 2))
- {
- optind = optind + 1;
+ if (newargc <= optind)
+ {
+ gk_dialog (GTK_MESSAGE_ERROR, _("Missing command to run."));
+ return 1;
+ }
- if (newargc <= optind)
- {
- gk_dialog (GTK_MESSAGE_ERROR, _("Missing command to run."));
- return 1;
- }
+ g_free (command);
+ command = g_strdup (newargv[optind]);
+ }
- g_free (command);
- command = g_strdup (newargv[optind]);
- }
+ for (i = optind + 1; i < newargc; i++)
+ {
+ tmp = g_strconcat (command, " '", newargv[i], "'", NULL);
+ g_free (command);
+ command = tmp;
+ }
+ gksu_context_set_command (context, command);
+ g_free (command);
+ }
- for (i = optind + 1; i < newargc; i++)
- {
- tmp = g_strconcat (command, " '", newargv[i], "'", NULL);
- g_free (command);
- command = tmp;
- }
- gksu_context_set_command (context, command);
- g_free (command);
- }
-
/*
* FIXME: should be moved to libgksu, which should have two new API functions:
* gksu_context_launcher_context_{initiate,complete}
More information about the gksu-commits
mailing list