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