436 lines
11 KiB
Diff
436 lines
11 KiB
Diff
--- gnome-system-monitor-2.9.90/configure.in.libgnomesu 2005-01-24 09:06:57.000000000 -0500
|
|
+++ gnome-system-monitor-2.9.90/configure.in 2005-02-02 15:03:45.000000000 -0500
|
|
@@ -19,9 +19,8 @@
|
|
LIBGTOP_REQUIRED=2.9.5
|
|
GTK_REQUIRED=2.5.0
|
|
GNOME_VFS_REQUIRED=2.6.0
|
|
-LIBGNOMESU_REQUIRED=0.9.3
|
|
|
|
-PKG_CHECK_MODULES(PROCMAN, libgnome-2.0 >= $LIBGNOME_REQUIRED libgnomeui-2.0 >= $LIBGNOMEUI_REQUIRED gconf-2.0 >= $GCONF_REQUIRED libgtop-2.0 >= $LIBGTOP_REQUIRED libwnck-1.0 >= $LIBWNCK_REQUIRED gtk+-2.0 >= $GTK_REQUIRED gnome-vfs-2.0 >= $GNOME_VFS_REQUIRED libgnomesu-1.0 >= $LIBGNOMESU_REQUIRED)
|
|
+PKG_CHECK_MODULES(PROCMAN, libgnome-2.0 >= $LIBGNOME_REQUIRED libgnomeui-2.0 >= $LIBGNOMEUI_REQUIRED gconf-2.0 >= $GCONF_REQUIRED libgtop-2.0 >= $LIBGTOP_REQUIRED libwnck-1.0 >= $LIBWNCK_REQUIRED gtk+-2.0 >= $GTK_REQUIRED gnome-vfs-2.0 >= $GNOME_VFS_REQUIRED)
|
|
|
|
|
|
AC_ARG_ENABLE(more-warnings,
|
|
--- gnome-system-monitor-2.9.90/src/procdialogs.c.libgnomesu 2005-01-13 19:05:00.000000000 -0500
|
|
+++ gnome-system-monitor-2.9.90/src/procdialogs.c 2005-02-02 15:03:45.000000000 -0500
|
|
@@ -23,7 +23,6 @@
|
|
|
|
#include <signal.h>
|
|
#include <string.h>
|
|
-#include <libgnomesu/libgnomesu.h>
|
|
#include "procdialogs.h"
|
|
#include "favorites.h"
|
|
#include "proctable.h"
|
|
@@ -815,13 +814,101 @@
|
|
void procdialog_create_root_password_dialog (gint type, ProcData *procdata, gint pid,
|
|
gint extra_value, gchar *text)
|
|
{
|
|
+ GtkWidget *dialog;
|
|
+ GtkWidget *error_dialog;
|
|
+ GtkWidget *main_vbox;
|
|
+ GtkWidget *hbox;
|
|
+ GtkWidget *entry;
|
|
+ GtkWidget *label;
|
|
+ gchar *title = NULL, *button_label;
|
|
gchar *command;
|
|
+ gchar *password, *blank;
|
|
+ gint retval;
|
|
+
|
|
+ if (type == 0) {
|
|
+ if (extra_value == SIGKILL) {
|
|
+ title = g_strdup (_("Kill Process"));
|
|
+ button_label = g_strdup (_("_Kill Process"));
|
|
+ }
|
|
+ else {
|
|
+ title = g_strdup (_("End Process"));
|
|
+ button_label = g_strdup (_("_End Process"));
|
|
+ }
|
|
+ }
|
|
+ else {
|
|
+ title = g_strdup (_("Change Priority"));
|
|
+ button_label = g_strdup (_("Change _Priority"));
|
|
+ }
|
|
+
|
|
+ dialog = gtk_dialog_new_with_buttons (title, NULL, GTK_DIALOG_DESTROY_WITH_PARENT,
|
|
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
|
|
+ button_label, 100,
|
|
+ NULL);
|
|
+
|
|
+ main_vbox = GTK_DIALOG (dialog)->vbox;
|
|
+
|
|
+ label = gtk_label_new (_(text));
|
|
+ gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
|
|
+ gtk_misc_set_padding (GTK_MISC (label), GNOME_PAD, 2 * GNOME_PAD);
|
|
+ gtk_box_pack_start (GTK_BOX (main_vbox), label, FALSE, FALSE, 0);
|
|
+
|
|
+ hbox = gtk_hbox_new (FALSE, 0);
|
|
+ gtk_container_set_border_width (GTK_CONTAINER (hbox), GNOME_PAD_SMALL);
|
|
+ gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, FALSE, 0);
|
|
+
|
|
+ label = gtk_label_new (_("Root Password :"));
|
|
+ gtk_misc_set_padding (GTK_MISC (label), GNOME_PAD_SMALL, 0);
|
|
+ gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, FALSE, 0);
|
|
+
|
|
+ entry = gtk_entry_new ();
|
|
+ gtk_entry_set_visibility (GTK_ENTRY (entry), FALSE);
|
|
+ gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, FALSE, 0);
|
|
+ g_signal_connect (G_OBJECT (entry), "activate",
|
|
+ G_CALLBACK (entry_activate_cb), dialog);
|
|
+
|
|
+ gtk_widget_show_all (main_vbox);
|
|
+
|
|
+ gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_CANCEL);
|
|
+ gtk_widget_grab_focus (entry);
|
|
+
|
|
+ g_free (title);
|
|
+ g_free (button_label);
|
|
+
|
|
+ retval = gtk_dialog_run (GTK_DIALOG (dialog));
|
|
+ gtk_widget_hide (dialog);
|
|
+
|
|
+ if (retval == 100) {
|
|
+ password = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
|
|
+
|
|
+ if (!password)
|
|
+ password = "";
|
|
+ blank = g_strdup (password);
|
|
+ if (strlen (blank))
|
|
+ memset (blank, ' ', strlen (blank));
|
|
+
|
|
+ gtk_entry_set_text (GTK_ENTRY (entry), blank);
|
|
+ gtk_entry_set_text (GTK_ENTRY (entry), "");
|
|
+ g_free (blank);
|
|
+
|
|
+ if (type == 0)
|
|
+ command = g_strdup_printf ("kill -s %d %d", extra_value, pid);
|
|
+ else
|
|
+ command = g_strdup_printf ("renice %d %d", extra_value, pid);
|
|
+
|
|
+ if (su_run_with_password (command, password) == -1) {
|
|
+ error_dialog = gtk_message_dialog_new (NULL,
|
|
+ GTK_DIALOG_DESTROY_WITH_PARENT,
|
|
+ GTK_MESSAGE_ERROR,
|
|
+ GTK_BUTTONS_OK,
|
|
+ "%s",
|
|
+ _("Wrong Password."));
|
|
+ gtk_dialog_run (GTK_DIALOG (error_dialog));
|
|
+ gtk_widget_destroy (error_dialog);
|
|
+ }
|
|
+ g_free (command);
|
|
+
|
|
+ }
|
|
+ gtk_widget_destroy (dialog);
|
|
|
|
- if (type == 0)
|
|
- command = g_strdup_printf ("kill -s %d %d", extra_value, pid);
|
|
- else
|
|
- command = g_strdup_printf ("renice %d %d", extra_value, pid);
|
|
- gnomesu_exec (command);
|
|
- g_free (command);
|
|
}
|
|
|
|
--- gnome-system-monitor-2.9.90/src/util.c.libgnomesu 2005-01-08 17:43:35.000000000 -0500
|
|
+++ gnome-system-monitor-2.9.90/src/util.c 2005-02-02 15:08:57.000000000 -0500
|
|
@@ -1,10 +1,294 @@
|
|
-#include "util.h"
|
|
|
|
+#define _GNU_SOURCE
|
|
#include <config.h>
|
|
|
|
+#include <stdio.h>
|
|
+#include <stdlib.h>
|
|
+#include <string.h>
|
|
+#include <unistd.h>
|
|
+#include <fcntl.h>
|
|
+#include <signal.h>
|
|
+#include <pwd.h>
|
|
+#include <sys/types.h>
|
|
+#include <sys/ioctl.h>
|
|
+#include <sys/wait.h>
|
|
+
|
|
+
|
|
+#ifdef __FreeBSD__
|
|
+# include <errno.h>
|
|
+# include <libutil.h>
|
|
+#endif
|
|
+
|
|
+#ifdef __sun
|
|
+# include <errno.h>
|
|
+# include <unistd.h>
|
|
+# include <stropts.h>
|
|
+# include <sys/stream.h>
|
|
+# include <sys/termios.h>
|
|
+# include <sys/ptem.h>
|
|
+#endif
|
|
+
|
|
+#include "util.h"
|
|
+
|
|
#include <gnome.h>
|
|
-#include <stddef.h>
|
|
|
|
+/* ABORT() kills GTK if we're not root, else it just exits.
|
|
+ */
|
|
+#define ABORT(root) \
|
|
+ if (root == 0) \
|
|
+ GTK_ABORT(); \
|
|
+ else \
|
|
+ _exit(-1)
|
|
+
|
|
+/* GTK_ABORT() is supposed to kill GTK and exit.
|
|
+ */
|
|
+#define GTK_ABORT() do { \
|
|
+ gtk_main_quit(); \
|
|
+ _exit(0); \
|
|
+ } while (0)
|
|
+
|
|
+/* OPEN_TTY() is supposed to return a file descriptor to a pseudo-terminal.
|
|
+ */
|
|
+#define OPEN_TTY() getpt()
|
|
+
|
|
+#ifdef __FreeBSD__
|
|
+/* FreeBSD doesn't have getpt(). This function emulates it's behaviour. */
|
|
+int getpt (void);
|
|
+
|
|
+int
|
|
+getpt ()
|
|
+{
|
|
+ int master, slave;
|
|
+
|
|
+ if (openpty (&master, &slave, NULL, NULL, NULL) < 0) {
|
|
+ /* Simulate getpt()'s only error condition. */
|
|
+ errno = ENOENT;
|
|
+ return -1;
|
|
+ }
|
|
+ return master;
|
|
+}
|
|
+#endif
|
|
+
|
|
+#ifdef __sun
|
|
+/* Sun doesn't have getpt(). This function emulates it's behavior. */
|
|
+int getpt (void);
|
|
+
|
|
+int
|
|
+getpt ()
|
|
+{
|
|
+ int fdm, fds;
|
|
+ extern int errno;
|
|
+ char *slavename;
|
|
+ /* extern char *ptsname(); */
|
|
+
|
|
+ /* open master */
|
|
+ fdm = open("/dev/ptmx", O_RDWR);
|
|
+ if ( fdm < 0 ) {
|
|
+ /* Simulate getpt()'s only error condition. */
|
|
+ errno = ENOENT;
|
|
+ return -1;
|
|
+ }
|
|
+ if ( grantpt(fdm) < 0 ) { /* change permission ofslave */
|
|
+ /* Simulate getpt()'s only error condition. */
|
|
+ errno = ENOENT;
|
|
+ return -1;
|
|
+ }
|
|
+ if ( unlockpt(fdm) < 0 ) { /* unlock slave */
|
|
+ /* Simulate getpt()'s only error condition. */
|
|
+ errno = ENOENT;
|
|
+ return -1;
|
|
+ }
|
|
+ slavename = ptsname(fdm); /* get name of slave */
|
|
+ if ( slavename == NULL ) {
|
|
+ /* Simulate getpt()'s only error condition. */
|
|
+ errno = ENOENT;
|
|
+ return -1;
|
|
+ }
|
|
+ fds = open(slavename, O_RDWR); /* open slave */
|
|
+ if ( fds < 0 ) {
|
|
+ /* Simulate getpt()'s only error condition. */
|
|
+ errno = ENOENT;
|
|
+ return -1;
|
|
+ }
|
|
+ ioctl(fds, I_PUSH, "ptem"); /* push ptem * /
|
|
+ ioctl(fds, I_PUSH, "ldterm"); /* push ldterm */
|
|
+
|
|
+ return fds;
|
|
+}
|
|
+
|
|
+/* Handle the fact that solaris doesn't have an asprintf */
|
|
+/* pinched from
|
|
+http://samba.anu.edu.au/rsync/doxygen/head/snprintf_8c-source.html */
|
|
+
|
|
+#ifndef HAVE_VASPRINTF
|
|
+int vasprintf(char **ptr, const char *format, va_list ap)
|
|
+{
|
|
+ int ret;
|
|
+
|
|
+ ret = vsnprintf(NULL, 0, format, ap);
|
|
+ if (ret <= 0) return ret;
|
|
+
|
|
+ (*ptr) = (char *)malloc(ret+1);
|
|
+ if (!*ptr) return -1;
|
|
+ ret = vsnprintf(*ptr, ret+1, format, ap);
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+#endif
|
|
+
|
|
+
|
|
+#ifndef HAVE_ASPRINTF
|
|
+ int asprintf(char **ptr, const char *format, ...)
|
|
+{
|
|
+ va_list ap;
|
|
+ int ret;
|
|
+
|
|
+ va_start(ap, format);
|
|
+ ret = vasprintf(ptr, format, ap);
|
|
+ va_end(ap);
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+#endif
|
|
+#endif
|
|
+
|
|
+static int root = 0; /* if we are root, no password is
|
|
+ required */
|
|
+
|
|
+static gint
|
|
+exec_su (gchar *exec_path, gchar *user, gchar *pwd)
|
|
+{
|
|
+ gchar *exec_p, *user_p; /* command to execute, user name */
|
|
+ pid_t pid;
|
|
+ int t_fd;
|
|
+
|
|
+ exec_p = g_strdup (exec_path);
|
|
+
|
|
+#if 0
|
|
+ if (asprintf (&exec_p, "%s&", exec_path) < 0) {
|
|
+ perror ("Unable to allocate memory chunk");
|
|
+ g_free (exec_p);
|
|
+ return 0;
|
|
+ }
|
|
+#endif
|
|
+
|
|
+ user_p = (user ? user : "root");
|
|
+
|
|
+ if ((pwd == NULL) || (*pwd == '\0')) {
|
|
+ g_free (exec_p);
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * Make su think we're sending the password from a terminal:
|
|
+ */
|
|
+
|
|
+ if (((t_fd = OPEN_TTY()) < 0) || (grantpt(t_fd) < 0) || (unlockpt(t_fd) < 0)) {
|
|
+ fprintf (stderr, "Unable to open a terminal\n");
|
|
+ ABORT (root);
|
|
+ }
|
|
+
|
|
+ if ((pid = fork()) < 0) {
|
|
+ perror ("Unable to fork a new process");
|
|
+ ABORT (root);
|
|
+ }
|
|
+
|
|
+ if (pid > 0) { /* parent process */
|
|
+ int status;
|
|
+
|
|
+ sleep(1);
|
|
+
|
|
+ /* su(1) won't want a password if we're already root.
|
|
+ */
|
|
+ if (root == 0) {
|
|
+ write (t_fd, pwd, strlen(pwd));
|
|
+
|
|
+ /* Need the \n to flush the password */
|
|
+ write (t_fd, "\n", 1);
|
|
+ }
|
|
+
|
|
+ waitpid (pid, &status, 0);
|
|
+
|
|
+ if (WIFEXITED (status) && WEXITSTATUS (status) && (WEXITSTATUS(status) < 255)) {
|
|
+/* error_box (_("Incorrect password.")); */
|
|
+ g_free (exec_p);
|
|
+ return -1;
|
|
+ }
|
|
+ else {
|
|
+ memset (pwd, 0, strlen (pwd));
|
|
+ }
|
|
+ }
|
|
+ else { /* child process */
|
|
+ struct passwd *pw;
|
|
+ char *env, *home, *pts;
|
|
+
|
|
+ /* We have rights to run X (obviously). We need to ensure the
|
|
+ * destination user has the right stuff in the environment
|
|
+ * to be able to continue to run X.
|
|
+ * su will change $HOME to the new users home, so we will
|
|
+ * need an XAUTHORITY / ICEAUTHORITY pointing to the
|
|
+ * authorization files.
|
|
+ */
|
|
+
|
|
+ if ((home = getenv ("HOME")) == NULL) {
|
|
+ if ((env = getenv ("USER")) == NULL)
|
|
+ pw = getpwuid(getuid());
|
|
+ else
|
|
+ pw = getpwnam(env);
|
|
+ if (pw)
|
|
+ home = pw->pw_dir;
|
|
+ else {
|
|
+ perror ("Unable to find home directory");
|
|
+ _exit (-1);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if ((env = getenv ("XAUTHORITY")) == NULL) {
|
|
+ if (asprintf (&env, "XAUTHORITY=%s/.Xauthority", home) > 0)
|
|
+ putenv (env);
|
|
+ else {
|
|
+ perror ("Unable to allocate memory chunk");
|
|
+ _exit (-1);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if ((env = getenv ("ICEAUTHORITY")) == NULL) {
|
|
+ if (asprintf (&env, "ICEAUTHORITY=%s/.ICEauthority", home) > 0)
|
|
+ putenv (env);
|
|
+ else {
|
|
+ perror ("Unable to allocate memory chunk");
|
|
+ _exit (-1);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if(((pts = ptsname(t_fd)) == NULL) || ((t_fd = open(pts, O_RDWR | O_NOCTTY)) < 0)) {
|
|
+ perror ("Unable to open pseudo slave terminal");
|
|
+ _exit (-1);
|
|
+ }
|
|
+ dup2 (t_fd, 0);
|
|
+
|
|
+#if 0
|
|
+ freopen ("/dev/null", "w", stderr);
|
|
+ freopen ("/dev/null", "w", stdout);
|
|
+#endif
|
|
+
|
|
+ execlp ("su", "su", "-m", user_p, "-c", exec_p, NULL);
|
|
+ _exit (0);
|
|
+
|
|
+ }
|
|
+
|
|
+ g_free (exec_p);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+gint
|
|
+su_run_with_password (gchar *exec_path, gchar *password)
|
|
+{
|
|
+ return exec_su (exec_path, "root", password);
|
|
+}
|
|
+
|
|
+#if 1
|
|
void _procman_array_gettext_init(const char * strings[], size_t n)
|
|
{
|
|
size_t i;
|
|
@@ -15,3 +299,4 @@
|
|
strings[i] = _(strings[i]);
|
|
}
|
|
}
|
|
+#endif
|