patches/libgksu1.2-04-rbac-support.diff
author yippi
Mon, 27 Sep 2010 21:07:51 +0000
changeset 20108 51df67ca9307
parent 16206 5b6c20a76753
child 20428 eea1d9ebe347
permissions -rw-r--r--
I had these modules listed as being owned by me, but they are really owned by wangke, correcting.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
15661
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
     1
diff -ru libgksu1.2-1.3.1/libgksu/gksu-context.c libgksu1.2-1.3.1-new/libgksu/gksu-context.c
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
     2
--- libgksu1.2-1.3.1/libgksu/gksu-context.c	2005-06-18 15:16:33.000000000 +0100
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
     3
+++ libgksu1.2-1.3.1-new/libgksu/gksu-context.c	2009-04-21 11:57:20.535637052 +0100
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
     4
@@ -23,7 +23,13 @@
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
     5
 #include <unistd.h>
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
     6
 #include <string.h>
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
     7
 #include <fcntl.h>
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
     8
+#ifndef __sun
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
     9
 #include <pty.h>
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    10
+#else
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    11
+#include <signal.h>
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    12
+#include <stropts.h>
16206
5b6c20a76753 2009-08-05 Lin Ma <[email protected]>
lin
parents: 15661
diff changeset
    13
+#include <strings.h>
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    14
+#endif
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
    15
 #include <pwd.h>
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
    16
 #include <sys/types.h>
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    17
 #include <sys/wait.h>
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    18
@@ -34,6 +40,10 @@
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    19
 #include <glib.h>
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    20
 #include <locale.h>
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    21
 
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    22
+#ifdef __sun
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    23
+#include "mkdtemp.c"
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    24
+#endif
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    25
+
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    26
 #ifdef ENABLE_GNOME_KEYRING
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    27
 #include <gnome-keyring.h>
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    28
 #endif
9819
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
    29
@@ -47,6 +57,8 @@
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
    30
 gboolean keyring_used = FALSE;
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
    31
 #endif
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
    32
 
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
    33
+#define MAX_BUFFER_SIZE 1024
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
    34
+
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
    35
 /* local function declarations */
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
    36
 static void
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
    37
 gksu_context_init (GTypeInstance *instance, gpointer g_class);
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
    38
@@ -228,6 +240,7 @@
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    39
   return context->login_shell;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    40
 }
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    41
 
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    42
+#ifndef __sun
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    43
 /**
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    44
  * gksu_context_set_keep_env:
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    45
  * @context: the #GksuContext you want to modify
9819
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
    46
@@ -258,6 +271,7 @@
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    47
 {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    48
   return context->keep_env;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    49
 }
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    50
+#endif
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    51
 
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    52
 /**
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    53
  * gksu_context_set_debug:
14430
969b5f184948 2008-10-09 Jim Li <[email protected]>
jim
parents: 14422
diff changeset
    54
@@ -363,6 +377,20 @@
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
    55
 
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
    56
   self->debug = FALSE;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
    57
   self->ssh_fwd = FALSE;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
    58
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
    59
+  self->message = NULL;
9768
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
    60
+  self->response = NULL;
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    61
+  self->privspec = NULL;
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
    62
+  self->msg_type = 0;
9768
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
    63
+  self->msg_num = 0;
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
    64
+  self->pfexec_mode = FALSE;
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    65
+  self->elevated_privilege = TRUE;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    66
+  self->elevated_role = TRUE;
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
    67
+  self->wait_for_child_to_exit = TRUE;
14430
969b5f184948 2008-10-09 Jim Li <[email protected]>
jim
parents: 14422
diff changeset
    68
+  self->need_pipe = TRUE;
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
    69
+  self->child_pid = 0;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
    70
+  self->stdin_fd = 0;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
    71
+  self->stdout_fd = 0;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
    72
 }
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
    73
 
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
    74
 static void
14430
969b5f184948 2008-10-09 Jim Li <[email protected]>
jim
parents: 14422
diff changeset
    75
@@ -378,6 +406,13 @@
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    76
   g_free (self->command);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    77
 
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    78
   g_free (self->user);
9768
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
    79
+  for ( int i = 0; i<self->msg_num; i++ ) {
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
    80
+	g_free (self->message[i].msg);
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
    81
+	g_free (self->response[i].resp);
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
    82
+  }
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    83
+  g_free (self->message);
9768
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
    84
+  g_free (self->response);
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    85
+  g_free (self->privspec);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    86
 }
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    87
 
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    88
 static void
14430
969b5f184948 2008-10-09 Jim Li <[email protected]>
jim
parents: 14422
diff changeset
    89
@@ -446,7 +481,7 @@
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    90
   g_strfreev (tmpv);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    91
 
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    92
   /* get the authorization token */
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    93
-  tmp = g_strdup_printf ("/usr/X11R6/bin/xauth list %s | "
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    94
+  tmp = g_strdup_printf ("/usr/bin/xauth list %s | "
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    95
 			 "head -1 | awk '{ print $3 }'",
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    96
 			 context->display);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
    97
   if ((xauth_output = popen (tmp, "r")) == NULL)
14430
969b5f184948 2008-10-09 Jim Li <[email protected]>
jim
parents: 14422
diff changeset
    98
@@ -526,10 +561,7 @@
8591
141ff3d98e93 * patches/libgksu1.2-04-rbac-support.diff:
jim
parents: 8489
diff changeset
    99
   in = open(fn, O_RDONLY);
141ff3d98e93 * patches/libgksu1.2-04-rbac-support.diff:
jim
parents: 8489
diff changeset
   100
   if (in == -1)
141ff3d98e93 * patches/libgksu1.2-04-rbac-support.diff:
jim
parents: 8489
diff changeset
   101
     {
141ff3d98e93 * patches/libgksu1.2-04-rbac-support.diff:
jim
parents: 8489
diff changeset
   102
-      fprintf (stderr,
141ff3d98e93 * patches/libgksu1.2-04-rbac-support.diff:
jim
parents: 8489
diff changeset
   103
-	       _("Error copying '%s' to '%s': %s"),
141ff3d98e93 * patches/libgksu1.2-04-rbac-support.diff:
jim
parents: 8489
diff changeset
   104
-	       fn, dir, strerror(errno));
141ff3d98e93 * patches/libgksu1.2-04-rbac-support.diff:
jim
parents: 8489
diff changeset
   105
-      return TRUE;
141ff3d98e93 * patches/libgksu1.2-04-rbac-support.diff:
jim
parents: 8489
diff changeset
   106
+      return FALSE;
141ff3d98e93 * patches/libgksu1.2-04-rbac-support.diff:
jim
parents: 8489
diff changeset
   107
     }
141ff3d98e93 * patches/libgksu1.2-04-rbac-support.diff:
jim
parents: 8489
diff changeset
   108
   
141ff3d98e93 * patches/libgksu1.2-04-rbac-support.diff:
jim
parents: 8489
diff changeset
   109
   while ((r = read(in, buf, BUFSIZ)) > 0) 
15661
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   110
@@ -550,14 +582,34 @@
8591
141ff3d98e93 * patches/libgksu1.2-04-rbac-support.diff:
jim
parents: 8489
diff changeset
   111
 	       fn, dir, strerror(errno));
141ff3d98e93 * patches/libgksu1.2-04-rbac-support.diff:
jim
parents: 8489
diff changeset
   112
       return TRUE;
141ff3d98e93 * patches/libgksu1.2-04-rbac-support.diff:
jim
parents: 8489
diff changeset
   113
     }
141ff3d98e93 * patches/libgksu1.2-04-rbac-support.diff:
jim
parents: 8489
diff changeset
   114
-
141ff3d98e93 * patches/libgksu1.2-04-rbac-support.diff:
jim
parents: 8489
diff changeset
   115
+  
141ff3d98e93 * patches/libgksu1.2-04-rbac-support.diff:
jim
parents: 8489
diff changeset
   116
   return FALSE;
141ff3d98e93 * patches/libgksu1.2-04-rbac-support.diff:
jim
parents: 8489
diff changeset
   117
 }
141ff3d98e93 * patches/libgksu1.2-04-rbac-support.diff:
jim
parents: 8489
diff changeset
   118
 
15661
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   119
+static gchar *
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   120
+sudo_get_home_dir (GksuContext *context)
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   121
+{
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   122
+  struct passwd *pwentry;
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   123
+
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   124
+  pwentry = getpwnam (gksu_context_get_user (context));
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   125
+  return g_strdup (pwentry->pw_dir);
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   126
+}
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   127
+
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   128
+
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   129
+static void
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   130
+sudo_reset_home_dir (gchar *home_env)
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   131
+{
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   132
+  /* reset the env var as it was before or clear it  */
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   133
+  if (home_env)
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   134
+    setenv ("HOME", home_env, TRUE);
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   135
+  else
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   136
+    unsetenv("HOME");
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   137
+}
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   138
+
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   139
 static gboolean
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   140
 sudo_prepare_xauth (GksuContext *context)
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   141
 {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   142
-  gchar template[] = "/tmp/" PACKAGE "-XXXXXX";
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   143
+  gchar template[] = "/tmp/" PACKAGE_NAME "-XXXXXX";
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   144
   gboolean error_copying = FALSE;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   145
   gchar *xauth = NULL;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   146
 
15661
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   147
@@ -591,9 +643,9 @@
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   148
   else
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   149
     unsetenv ("XAUTHORITY");
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   150
   
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   151
-  if (context->debug)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   152
-    fprintf (stderr, "xauth: %s\nxauth_env: %s\ndir: %s\n",
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   153
-	     xauth, xauth_env, context->dir);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   154
+//  if (context->debug)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   155
+//    fprintf (stderr, "xauth: %s\nxauth_env: %s\ndir: %s\n",
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   156
+//	     xauth, xauth_env, context->dir);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   157
   
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   158
   unlink (xauth);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   159
   rmdir (context->dir);
15661
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   160
@@ -673,6 +725,7 @@
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   161
 }
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   162
 #endif
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   163
 
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   164
+#ifndef __sun 
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   165
 gboolean
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   166
 try_su_run (GksuContext *context)
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   167
 {
15661
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   168
@@ -682,7 +735,94 @@
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   169
 
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   170
   gboolean need_pass = TRUE;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   171
 
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   172
+#ifdef __sun
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   173
+  int slave;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   174
+  char *slave_name;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   175
+  void *sig_saved;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   176
+  int fd;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   177
+
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   178
+  fdpty = open("/dev/ptmx", O_RDWR|O_NOCTTY);  /* open master */
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   179
+  sig_saved = signal(SIGCHLD, SIG_DFL);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   180
+  grantpt(fdpty);                     /* change permission of   slave */
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   181
+  unlockpt(fdpty);                    /* unlock slave */
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   182
+  signal(SIGCHLD,sig_saved);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   183
+  slave_name = ptsname(fdpty);         /* get name of slave */
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   184
+  slave = open(slave_name, O_RDWR);    /* open slave */
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   185
+  ioctl(slave, I_PUSH, "ptem");       /* push ptem */
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   186
+  ioctl(slave, I_PUSH, "ldterm");     /* push ldterm*/
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   187
+  ioctl(slave, I_PUSH, "ttcompat");     /* push ttcompat*/
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   188
+  if (fdpty < 0 || slave < 0) {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   189
+	  pid = -1;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   190
+  } else {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   191
+	  switch (pid = fork()) {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   192
+	  case -1: break;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   193
+	  case 0:
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   194
+		  /* First disconnect from the old controlling tty. */
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   195
+#ifdef TIOCNOTTY
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   196
+		  fd = open("/dev/tty", O_RDWR | O_NOCTTY);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   197
+		  if (fd >= 0) {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   198
+			  (void) ioctl(fd, TIOCNOTTY, NULL);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   199
+			  close(fd);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   200
+		  }
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   201
+#endif /* TIOCNOTTY */
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   202
+
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   203
+		  if (setsid() < 0) {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   204
+			  pid = -1;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   205
+			  break;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   206
+		  }
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   207
+
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   208
+		  /*
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   209
+		   * Verify that we are successfully disconnected from the
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   210
+		   * controlling tty.
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   211
+		   */
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   212
+		  fd = open("/dev/tty", O_RDWR | O_NOCTTY);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   213
+		  if (fd >= 0) {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   214
+			  pid = -1;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   215
+			  close(fd);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   216
+			  break;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   217
+		  }
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   218
+
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   219
+		  /* Make it our controlling tty. */
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   220
+#ifdef TIOCSCTTY
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   221
+		  if (ioctl(slave, TIOCSCTTY, NULL) < 0) {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   222
+			  pid = -1;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   223
+			  break;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   224
+		  }
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   225
+#endif /* TIOCSCTTY */
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   226
+		  fd = open(slave_name, O_RDWR);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   227
+		  if (fd < 0) {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   228
+			  pid = -1;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   229
+			  break;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   230
+		  } else {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   231
+			  close(fd);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   232
+		  }
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   233
+
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   234
+		  /* Verify that we now have a controlling tty. */
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   235
+		  fd = open("/dev/tty", O_WRONLY);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   236
+		  if (fd < 0) {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   237
+			  pid = -1;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   238
+			  break;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   239
+		  } else {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   240
+			  close(fd);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   241
+		  }
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   242
+		  (void) close(fdpty);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   243
+		  (void) dup2(slave, 0);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   244
+		  (void) dup2(slave, 1);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   245
+		  (void) dup2(slave, 2);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   246
+		  if (slave > 2)
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   247
+			  (void) close(slave);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   248
+		  pid = 0;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   249
+		  break;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   250
+	  default:
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   251
+		  /*
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   252
+		   * parent
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   253
+		   */
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   254
+		  (void) close(slave);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   255
+	  }
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   256
+  }
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   257
+#else
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   258
   pid = forkpty (&fdpty, NULL, NULL, NULL);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   259
+#endif
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   260
   if (pid == 0)
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   261
     {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   262
       gchar **cmd = g_malloc (sizeof(gchar*)*7);
15661
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   263
@@ -801,12 +941,12 @@
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   264
   int i = 0;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   265
   gboolean auth_failed = FALSE;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   266
 
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   267
-  gchar auxcommand[] = PREFIX "/lib/" PACKAGE "/gksu-run-helper";
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   268
+  gchar auxcommand[] = PREFIX "/lib/" PACKAGE_NAME "/gksu-run-helper";
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   269
 
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   270
   int fdpty;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   271
   pid_t pid;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   272
 
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   273
-  gksu_quark = g_quark_from_string (PACKAGE);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   274
+  gksu_quark = g_quark_from_string (PACKAGE_NAME);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   275
 
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   276
   if (!context->command)
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   277
     {
15661
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   278
@@ -830,7 +970,94 @@
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   279
   */
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   280
   prepare_xauth (context);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   281
 
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   282
+#ifdef __sun
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   283
+  int slave;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   284
+  char *slave_name;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   285
+  void *sig_saved;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   286
+  int fd;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   287
+
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   288
+  fdpty = open("/dev/ptmx", O_RDWR|O_NOCTTY);  /* open master */
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   289
+  sig_saved = signal(SIGCHLD, SIG_DFL);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   290
+  grantpt(fdpty);                     /* change permission of   slave */
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   291
+  unlockpt(fdpty);                    /* unlock slave */
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   292
+  signal(SIGCHLD,sig_saved);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   293
+  slave_name = ptsname(fdpty);         /* get name of slave */
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   294
+  slave = open(slave_name, O_RDWR);    /* open slave */
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   295
+  ioctl(slave, I_PUSH, "ptem");       /* push ptem */
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   296
+  ioctl(slave, I_PUSH, "ldterm");     /* push ldterm*/
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   297
+  ioctl(slave, I_PUSH, "ttcompat");     /* push ttcompat*/
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   298
+  if (fdpty < 0 || slave < 0) {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   299
+	  pid = -1;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   300
+  } else {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   301
+	  switch (pid = fork()) {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   302
+	  case -1: break;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   303
+	  case 0:
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   304
+		  /* First disconnect from the old controlling tty. */
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   305
+#ifdef TIOCNOTTY
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   306
+		  fd = open("/dev/tty", O_RDWR | O_NOCTTY);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   307
+		  if (fd >= 0) {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   308
+			  (void) ioctl(fd, TIOCNOTTY, NULL);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   309
+			  close(fd);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   310
+		  }
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   311
+#endif /* TIOCNOTTY */
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   312
+
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   313
+		  if (setsid() < 0) {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   314
+			  pid = -1;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   315
+			  break;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   316
+		  }
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   317
+
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   318
+		  /*
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   319
+		   * Verify that we are successfully disconnected from the
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   320
+		   * controlling tty.
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   321
+		   */
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   322
+		  fd = open("/dev/tty", O_RDWR | O_NOCTTY);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   323
+		  if (fd >= 0) {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   324
+			  pid = -1;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   325
+			  close(fd);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   326
+			  break;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   327
+		  }
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   328
+
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   329
+		  /* Make it our controlling tty. */
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   330
+#ifdef TIOCSCTTY
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   331
+		  if (ioctl(slave, TIOCSCTTY, NULL) < 0) {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   332
+			  pid = -1;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   333
+			  break;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   334
+		  }
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   335
+#endif /* TIOCSCTTY */
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   336
+		  fd = open(slave_name, O_RDWR);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   337
+		  if (fd < 0) {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   338
+			  pid = -1;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   339
+			  break;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   340
+		  } else {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   341
+			  close(fd);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   342
+		  }
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   343
+
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   344
+		  /* Verify that we now have a controlling tty. */
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   345
+		  fd = open("/dev/tty", O_WRONLY);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   346
+		  if (fd < 0) {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   347
+			  pid = -1;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   348
+			  break;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   349
+		  } else {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   350
+			  close(fd);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   351
+		  }
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   352
+		  (void) close(fdpty);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   353
+		  (void) dup2(slave, 0);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   354
+		  (void) dup2(slave, 1);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   355
+		  (void) dup2(slave, 2);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   356
+		  if (slave > 2)
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   357
+			  (void) close(slave);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   358
+		  pid = 0;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   359
+		  break;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   360
+	  default:
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   361
+		  /*
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   362
+		   * parent
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   363
+		   */
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   364
+		  (void) close(slave);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   365
+	  }
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   366
+  }
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   367
+#else
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   368
   pid = forkpty (&fdpty, NULL, NULL, NULL);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   369
+#endif
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   370
   if (pid == 0)
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   371
     {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   372
       gchar **cmd = g_malloc (sizeof(gchar*)*7);
15661
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   373
@@ -1060,6 +1287,7 @@
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   374
 
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   375
   return 0;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   376
 }
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   377
+#endif
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   378
 
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   379
 static gboolean
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   380
 try_sudo_validation (GksuContext *context)
15661
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   381
@@ -1238,7 +1466,7 @@
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   382
   int parent_pipe[2];	/* For talking to the parent */
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   383
   int child_pipe[2];	/* For talking to the child */
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   384
   
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   385
-  gksu_quark = g_quark_from_string (PACKAGE);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   386
+  gksu_quark = g_quark_from_string (PACKAGE_NAME);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   387
 
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   388
   if (!context->command)
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   389
     {
15661
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   390
@@ -1496,3 +1724,1184 @@
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   391
   return FALSE;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   392
 }
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   393
 
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   394
+gboolean
9768
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   395
+parse_embedded_su_output (GksuContext *context, char *outline, int *num)
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   396
+{
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   397
+	char *buf;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   398
+	char *prompt;
9819
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
   399
+	gboolean complete_block_read; /* Set if we have not parsed complete block */
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   400
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   401
+	if (context->debug)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   402
+		fprintf (stderr, "Output from Child: %s\n", outline);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   403
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   404
+	/* Now process items from the child. */
9819
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
   405
+	complete_block_read = FALSE;
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   406
+	if (outline != NULL) {
9768
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   407
+		
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   408
+		if (*num  ==  context->msg_num) {
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   409
+			if ( strncmp (outline, "SUCCESS", strlen("SUCCESS") ) == 0 ) {
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   410
+				context->msg_type = ES_SUCCESS;
9819
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
   411
+				complete_block_read = TRUE;
9768
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   412
+			} else if ( strncmp (outline, "ERROR", strlen("ERROR") ) == 0 ) {
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   413
+				context->msg_type = ES_ERROR;
9819
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
   414
+				complete_block_read = TRUE;
9768
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   415
+			} else if ( strncmp (outline, "CONV", strlen("CONV") ) == 0) {
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   416
+				sscanf(outline, "CONV %d", &(context->msg_num) );
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   417
+				context->message = (struct pam_message *)g_malloc ( sizeof(struct pam_message)*context->msg_num );
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   418
+				context->response = (struct pam_response *)g_malloc ( sizeof(struct pam_response)*context->msg_num );
14761
ada30a14249c 2008-12-12 Jim Li <[email protected]>
jim
parents: 14430
diff changeset
   419
+				for (int i=0; i<context->msg_num; i++) {
ada30a14249c 2008-12-12 Jim Li <[email protected]>
jim
parents: 14430
diff changeset
   420
+					context->message[i].msg = NULL;
ada30a14249c 2008-12-12 Jim Li <[email protected]>
jim
parents: 14430
diff changeset
   421
+					context->response[i].resp = NULL;
ada30a14249c 2008-12-12 Jim Li <[email protected]>
jim
parents: 14430
diff changeset
   422
+				}
9768
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   423
+				*num = 0;
9819
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
   424
+				complete_block_read = TRUE;
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
   425
+			}
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
   426
+			else {
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
   427
+			    context->msg_type = 0;
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
   428
+				complete_block_read = TRUE;
9768
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   429
+			}
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   430
+		} else {
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   431
+			if ( strncmp (outline, ".", 1) == 0 ) {
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   432
+				(*num)++;
9819
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
   433
+				complete_block_read = TRUE;
9768
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   434
+			} else if ( strncmp ( outline, "PAM_PROMPT_ECHO_ON", strlen("PAM_PROMPT_ECHO_ON") ) == 0 ) {
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   435
+				context->message[*num].msg_style = PAM_PROMPT_ECHO_ON;
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   436
+			} else if ( strncmp ( outline, "PAM_PROMPT_ECHO_OFF", strlen("PAM_PROMPT_ECHO_OFF") ) == 0 ) {
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   437
+				context->message[*num].msg_style = PAM_PROMPT_ECHO_OFF;
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   438
+			} else if ( strncmp ( outline, "PAM_ERROR_MSG", strlen("PAM_ERROR_MSG") ) == 0 ) {
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   439
+				context->message[*num].msg_style = PAM_ERROR_MSG;
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   440
+			} else if ( strncmp ( outline, "PAM_TEXT_INFO", strlen("PAM_TEXT_INFO") ) == 0 ) {
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   441
+				context->message[*num].msg_style = PAM_TEXT_INFO;
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   442
+			} else {
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   443
+				switch (context->message[*num].msg_style) {
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   444
+				case PAM_PROMPT_ECHO_OFF:
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   445
+				case PAM_PROMPT_ECHO_ON:
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   446
+					if ( context->message[*num].msg == NULL )
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   447
+						context->message[*num].msg = strdup(outline);
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   448
+					context->msg_type = ES_PASSWORD;
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   449
+					break;
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   450
+				case PAM_ERROR_MSG:
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   451
+				case PAM_TEXT_INFO:
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   452
+					if ( context->message[*num].msg == NULL )
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   453
+						context->message[*num].msg = strdup(outline);
14761
ada30a14249c 2008-12-12 Jim Li <[email protected]>
jim
parents: 14430
diff changeset
   454
+					if (context->debug)
ada30a14249c 2008-12-12 Jim Li <[email protected]>
jim
parents: 14430
diff changeset
   455
+					  {
ada30a14249c 2008-12-12 Jim Li <[email protected]>
jim
parents: 14430
diff changeset
   456
+						fprintf (stderr, "message[*num].msg = %s\n", context->message[0].msg);
ada30a14249c 2008-12-12 Jim Li <[email protected]>
jim
parents: 14430
diff changeset
   457
+					  }
9768
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   458
+					break;
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   459
+				default:
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   460
+					break;
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   461
+				}
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   462
+			}
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   463
+		}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   464
+	}
9819
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
   465
+	return complete_block_read;
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   466
+}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   467
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   468
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   469
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   470
+static gboolean
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   471
+try_embedded_su_validation (GksuContext *context)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   472
+{
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   473
+  char **cmd;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   474
+  int argcount = 4;
9819
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
   475
+  char buffer[MAX_BUFFER_SIZE];
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   476
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   477
+  pid_t pid;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   478
+  int status;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   479
+  size_t r;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   480
+  FILE *infile, *outfile;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   481
+  int parent_pipe[2];	/* For talking to the parent */
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   482
+  int child_pipe[2];	/* For talking to the child */
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   483
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   484
+  gboolean need_pass = TRUE;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   485
+  
9819
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
   486
+  bzero(buffer, MAX_BUFFER_SIZE);
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   487
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   488
+  if ((pipe(parent_pipe)) == -1)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   489
+    return TRUE;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   490
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   491
+  if ((pipe(child_pipe)) == -1)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   492
+    return TRUE;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   493
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   494
+  cmd = g_new (gchar *, argcount + 1);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   495
+  
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   496
+  argcount = 0;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   497
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   498
+  /* embedded_su binary */
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   499
+  cmd[argcount] = g_strdup("/usr/lib/embedded_su");
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   500
+  argcount++;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   501
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   502
+  if (context->login_shell)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   503
+	{
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   504
+		cmd[argcount] = g_strdup ("-"); argcount++;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   505
+	}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   506
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   507
+  cmd[argcount] = g_strdup (context->user);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   508
+  argcount++;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   509
+
8489
c9b7ed8789d4 * patches/libgksu1.2-04-rbac-support.diff:
jim
parents: 8393
diff changeset
   510
+  cmd[argcount] = g_strdup ("-c");
c9b7ed8789d4 * patches/libgksu1.2-04-rbac-support.diff:
jim
parents: 8393
diff changeset
   511
+  argcount++;
c9b7ed8789d4 * patches/libgksu1.2-04-rbac-support.diff:
jim
parents: 8393
diff changeset
   512
+
c9b7ed8789d4 * patches/libgksu1.2-04-rbac-support.diff:
jim
parents: 8393
diff changeset
   513
+  cmd[argcount] = g_strdup ("echo > /dev/null");
c9b7ed8789d4 * patches/libgksu1.2-04-rbac-support.diff:
jim
parents: 8393
diff changeset
   514
+  argcount++;
c9b7ed8789d4 * patches/libgksu1.2-04-rbac-support.diff:
jim
parents: 8393
diff changeset
   515
+
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   516
+  cmd[argcount] = NULL;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   517
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   518
+  pid = fork();
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   519
+  if (pid == -1)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   520
+    return TRUE;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   521
+  else if (pid == 0) 
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   522
+    {
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   523
+      // Child
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   524
+      close(child_pipe[1]);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   525
+      dup2(child_pipe[0], STDIN_FILENO);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   526
+      dup2(parent_pipe[1], STDOUT_FILENO);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   527
+      
9177
f049f5821937 2007-02-05 Takao Fujiwara <[email protected]>
fujiwara
parents: 9161
diff changeset
   528
+      execv(cmd[0], cmd);
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   529
+      
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   530
+      return TRUE;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   531
+    } 
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   532
+  else 
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   533
+    {
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   534
+      // Parent
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   535
+      close(parent_pipe[1]);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   536
+      
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   537
+      infile = fdopen(parent_pipe[0], "r");
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   538
+      if (!infile)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   539
+	return TRUE;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   540
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   541
+      outfile = fdopen(child_pipe[1], "w");
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   542
+      if (!outfile)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   543
+	return TRUE;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   544
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   545
+      // start conversation with embedded_su 
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   546
+      write (child_pipe[1], ".\n", 2);
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   547
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   548
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   549
+      /*
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   550
+	we are expecting to receive a GNOME_SUDO_PASS
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   551
+	if we don't there are two possibilities: an error
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   552
+	or a password is not needed
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   553
+      */
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   554
+      gboolean embedded_su_conv = FALSE;
9768
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   555
+      int n = 0;
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   556
+
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   557
+      while ( 1 )
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   558
+	{
9819
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
   559
+	  bzero(buffer, MAX_BUFFER_SIZE);
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
   560
+	  r = fgets (buffer, MAX_BUFFER_SIZE-1, infile);
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   561
+	  if (context->debug)
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   562
+		fprintf (stderr, "buffer: -%s-\n", buffer);
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   563
+
9819
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
   564
+      	if ( parse_embedded_su_output (context, buffer, &n) == FALSE ) {
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
   565
+            /* We've started to parse a conversation block, but need more */
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
   566
+            continue;
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
   567
+        }
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   568
+
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   569
+	switch (context->msg_type) {
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   570
+		case ES_SUCCESS:
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   571
+			if (context->debug)
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   572
+			  fprintf (stderr, "We won't need a password, it seems!\n");
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   573
+			
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   574
+			embedded_su_conv = FALSE;
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   575
+			need_pass = FALSE;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   576
+			break;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   577
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   578
+		case ES_ERROR:
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   579
+			embedded_su_conv = FALSE;
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   580
+			break;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   581
+
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   582
+		case ES_PASSWORD:
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   583
+			if (context->debug)
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   584
+	    		  fprintf (stderr, "Yeah, we're in...\n");
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   585
+			
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   586
+			write (child_pipe[1], "\n", 1);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   587
+			kill (pid, SIGKILL);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   588
+			embedded_su_conv = FALSE;
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   589
+			break;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   590
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   591
+		default:
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   592
+			embedded_su_conv = TRUE;
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   593
+			break;
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   594
+	  }
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   595
+
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   596
+	  if (!embedded_su_conv)
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   597
+		{
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   598
+		  if (context->debug)
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   599
+		    fprintf (stderr, "I'm going to break!\n");
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   600
+		  break;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   601
+		}
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   602
+
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   603
+	}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   604
+
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   605
+//      kill (pid, SIGKILL);
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   606
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   607
+//      g_timeout_add(3000, ack_killed_child, GINT_TO_POINTER(pid));
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   608
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   609
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   610
+      while (!waitpid (pid, &status, WNOHANG))
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   611
+	{
9819
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
   612
+	  bzero(buffer, MAX_BUFFER_SIZE);
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
   613
+	  if(!fgets (buffer, MAX_BUFFER_SIZE-1, infile))
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   614
+	    break;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   615
+	  fprintf (stderr, "%s", buffer);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   616
+	}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   617
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   618
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   619
+      /* make sure we did read everything */
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   620
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   621
+      while (1)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   622
+	{
9819
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
   623
+	  bzero(buffer, MAX_BUFFER_SIZE);
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
   624
+	  if(!fread (buffer, sizeof(gchar), MAX_BUFFER_SIZE-1, infile))
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   625
+	    break;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   626
+	  fprintf (stderr, "%s", buffer);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   627
+	  fflush (stderr);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   628
+	}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   629
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   630
+    }
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   631
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   632
+  return need_pass;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   633
+}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   634
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   635
+/**
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   636
+ * gksu_context_embedded_su_try_need_password
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   637
+ * @context: a #GksuContext
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   638
+ *
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   639
+ * Checks if we need to ask for a password or if we have ways of
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   640
+ * getting the password for ourselves or we simply don't need it.
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   641
+ *
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   642
+ * Returns: TRUE if requesting a password is needed, FALSE otherwise.
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   643
+ *
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   644
+ */
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   645
+gboolean
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   646
+gksu_context_embedded_su_try_need_password (GksuContext *context)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   647
+{
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   648
+  if (!try_embedded_su_validation (context))
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   649
+    return FALSE;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   650
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   651
+  return TRUE;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   652
+}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   653
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   654
+/**
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   655
+ * gksu_context_embedded_su_run:
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   656
+ * @context: a #GksuContext
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   657
+ * @error: a #GError object to be filled with the error code or NULL
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   658
+ *
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   659
+ * This could be considered one of the main functions in GKSu.
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   660
+ * it is responsible for doing the 'user changing' magic by
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   661
+ * calling gksu_ask_password() if it needs the user's password
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   662
+ * it behaves like sudo.
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   663
+ *
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   664
+ * Returns: the child's error status, 0 if all went fine, -1 if failed
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   665
+ */
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   666
+gboolean
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   667
+gksu_context_embedded_su_run (GksuContext *context, GError **error)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   668
+{
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   669
+  char **cmd;
9819
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
   670
+  char buffer[MAX_BUFFER_SIZE];
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   671
+  int argcount = 8;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   672
+  int i, j;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   673
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   674
+  GQuark gksu_quark;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   675
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   676
+  gchar *xauth = NULL, 
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   677
+    *xauth_env = NULL;
15661
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   678
+  gchar *home = NULL,
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   679
+    *home_env = NULL;
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   680
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   681
+  pid_t pid;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   682
+  int status;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   683
+  size_t r;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   684
+  FILE *infile, *outfile;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   685
+  int parent_pipe[2];	/* For talking to the parent */
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   686
+  int child_pipe[2];	/* For talking to the child */
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   687
+  
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   688
+  gksu_quark = g_quark_from_string (PACKAGE_NAME);
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   689
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   690
+  if (!context->command)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   691
+    {
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   692
+      g_set_error (error, gksu_quark, GKSU_CONTEXT_ERROR_NOCOMMAND,
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   693
+		   _("gksu_sudo_run needs a command to be run, "
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   694
+		     "none was provided."));
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   695
+      return -1;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   696
+    }
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   697
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   698
+  /* 
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   699
+     FIXME: need to check if we are in X
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   700
+  */
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   701
+  if (sudo_prepare_xauth (context) == 1)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   702
+    {
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   703
+      g_set_error (error, gksu_quark, GKSU_CONTEXT_ERROR_XAUTH,
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   704
+		   _("Unable to copy the user's Xauthorization file."));
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   705
+      return -1;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   706
+    }
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   707
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   708
+  /* sets XAUTHORITY */
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   709
+  xauth = g_strdup_printf ("%s/.Xauthority", context->dir);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   710
+  xauth_env = getenv ("XAUTHORITY");
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   711
+  setenv ("XAUTHORITY", xauth, TRUE);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   712
+
15661
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   713
+  /*
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   714
+   * Check if the HOME environment variable is set in the user's
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   715
+   * environment. If so unset it:
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   716
+   * This will ensure that apps that require write
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   717
+   * permission eg. gconf client applications, will work.
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   718
+   */
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   719
+  home_env = getenv ("HOME");
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   720
+  home = sudo_get_home_dir (context);
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   721
+  setenv ("HOME", home, TRUE);
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   722
+ 
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   723
+ if (context->debug)
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   724
+   {
15661
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   725
+    fprintf (stderr, "HOME: %s\n", home);
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   726
+    fprintf (stderr, "xauth: %s\n", xauth);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   727
+   }
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   728
+
15661
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   729
+  g_free(home);
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   730
+  cmd = g_new (gchar *, argcount + 1);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   731
+  
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   732
+  argcount = 0;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   733
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   734
+  /* embedded_su binary */
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   735
+  cmd[argcount] = g_strdup("/usr/lib/embedded_su");
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   736
+  argcount++;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   737
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   738
+  if (context->login_shell)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   739
+    {
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   740
+      cmd[argcount] = g_strdup("-");
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   741
+      argcount++;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   742
+    }
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   743
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   744
+  /* user */
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   745
+  cmd[argcount] = g_strdup(context->user);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   746
+  argcount++;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   747
+
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   748
+  /* command */
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   749
+  cmd[argcount] = g_strdup("-c");
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   750
+  argcount++;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   751
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   752
+  cmd[argcount] = g_strdup_printf("%s", context->command);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   753
+  argcount++;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   754
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   755
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   756
+  cmd[argcount] = NULL;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   757
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   758
+  if (context->debug)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   759
+    {
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   760
+      for (i = 0; cmd[i] != NULL; i++)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   761
+	fprintf (stderr, "cmd[%d]: %s\n", i, cmd[i]);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   762
+    }
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   763
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   764
+  if ((pipe(parent_pipe)) == -1)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   765
+    {
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   766
+      g_set_error (error, gksu_quark, GKSU_CONTEXT_ERROR_PIPE,
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   767
+		   _("Error creating pipe: %s"),
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   768
+		   strerror(errno));
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   769
+      sudo_reset_xauth (context, xauth, xauth_env);
15661
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   770
+      sudo_reset_home_dir (home_env);
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   771
+      return -1;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   772
+    }
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   773
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   774
+  if ((pipe(child_pipe)) == -1)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   775
+    {
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   776
+      g_set_error (error, gksu_quark, GKSU_CONTEXT_ERROR_PIPE,
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   777
+		   _("Error creating pipe: %s"),
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   778
+		   strerror(errno));
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   779
+      sudo_reset_xauth (context, xauth, xauth_env);
15661
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   780
+      sudo_reset_home_dir (home_env);
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   781
+      return -1;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   782
+    }
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   783
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   784
+  pid = fork();
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   785
+  if (pid == -1)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   786
+    {
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   787
+      g_set_error (error, gksu_quark, GKSU_CONTEXT_ERROR_FORK,
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   788
+		   _("Failed to fork new process: %s"),
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   789
+		   strerror(errno));
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   790
+      sudo_reset_xauth (context, xauth, xauth_env);
15661
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   791
+      sudo_reset_home_dir (home_env);
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   792
+      return -1;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   793
+    }
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   794
+  else if (pid == 0) 
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   795
+    {
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   796
+      // Child
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   797
+      setsid();   // make us session leader
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   798
+      close(child_pipe[1]);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   799
+      dup2(child_pipe[0], STDIN_FILENO);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   800
+      dup2(parent_pipe[1], STDERR_FILENO);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   801
+      dup2(parent_pipe[1], STDOUT_FILENO);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   802
+      
9177
f049f5821937 2007-02-05 Takao Fujiwara <[email protected]>
fujiwara
parents: 9161
diff changeset
   803
+      execv(cmd[0], cmd);
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   804
+      
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   805
+      g_set_error (error, gksu_quark, GKSU_CONTEXT_ERROR_EXEC,
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   806
+		   _("Failed to exec new process: %s"),
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   807
+		   strerror(errno));
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   808
+      sudo_reset_xauth (context, xauth, xauth_env);
15661
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   809
+      sudo_reset_home_dir (home_env);
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   810
+      return -1;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   811
+    } 
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   812
+  else 
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   813
+    {
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   814
+      gboolean auth_failed = FALSE;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   815
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   816
+      // Parent
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   817
+      close(parent_pipe[1]);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   818
+      
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   819
+      infile = fdopen(parent_pipe[0], "r");
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   820
+      if (!infile)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   821
+	{
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   822
+	  g_set_error (error, gksu_quark, GKSU_CONTEXT_ERROR_PIPE,
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   823
+		       _("Error opening pipe: %s"),
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   824
+		       strerror(errno));
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   825
+	  sudo_reset_xauth (context, xauth, xauth_env);
15661
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   826
+	  sudo_reset_home_dir (home_env);
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   827
+	  return -1;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   828
+	}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   829
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   830
+      outfile = fdopen(child_pipe[1], "w");
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   831
+      if (!outfile)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   832
+	{
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   833
+	  g_set_error (error, gksu_quark, GKSU_CONTEXT_ERROR_PIPE,
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   834
+		       _("Error opening pipe: %s"),
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   835
+		       strerror(errno));
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   836
+	  sudo_reset_xauth (context, xauth, xauth_env);
15661
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   837
+	  sudo_reset_home_dir (home_env);
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   838
+	  return -1;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   839
+	}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   840
+      context->stdin_fd = parent_pipe[0];
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   841
+      context->stdout_fd = child_pipe[1];
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   842
+      context->stdin_file = infile;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   843
+      context->stdout_file = outfile;
9235
b2a55defbb7e 2007-02-09 Jim Li <[email protected]>
jim
parents: 9177
diff changeset
   844
+      setvbuf (context->stdin_file, NULL, _IONBF, 0);
b2a55defbb7e 2007-02-09 Jim Li <[email protected]>
jim
parents: 9177
diff changeset
   845
+      fcntl (context->stdin_fd, F_SETFL, 0);
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   846
+      context->child_pid = pid;
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   847
+
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   848
+      // start conversation with embedded_su 
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   849
+      write (child_pipe[1], ".\n", 2);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   850
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   851
+      /*
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   852
+	we are expecting to receive a GNOME_SUDO_PASS
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   853
+	if we don't there are two possibilities: an error
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   854
+	or a password is not needed
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   855
+      */
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   856
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   857
+      gboolean embedded_su_conv = FALSE;
9768
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
   858
+      int n = 0;
9819
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
   859
+      gboolean found_dot = FALSE;
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   860
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   861
+      while ( 1 )
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   862
+	{
9819
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
   863
+	  bzero(buffer, MAX_BUFFER_SIZE);
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
   864
+	  r = fgets (buffer, MAX_BUFFER_SIZE-1, infile);
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
   865
+
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   866
+	  if (context->debug)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   867
+		fprintf (stderr, "buffer: -%s-\n", buffer);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   868
+
9819
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
   869
+      	if ( parse_embedded_su_output (context, buffer, &n) == FALSE ) {
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
   870
+            /* We've started to parse a conversation block, but need more */
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
   871
+            continue;
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
   872
+        }
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   873
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   874
+	switch (context->msg_type) {
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   875
+		case ES_SUCCESS:
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   876
+			if (context->debug)
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   877
+			  fprintf (stderr, "We won't need a password, it seems!\n");
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   878
+			embedded_su_conv = FALSE;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   879
+			break;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   880
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   881
+		case ES_ERROR:
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   882
+			auth_failed = TRUE;
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   883
+			embedded_su_conv = FALSE;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   884
+			break;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   885
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   886
+		case ES_PASSWORD:
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   887
+			if (context->debug)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   888
+	    		  fprintf (stderr, "Yeah, we're in...\n");
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   889
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   890
+			if (context->password == NULL || (!strcmp (context->password, "")))
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   891
+	    		  {
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   892
+				g_set_error (error, gksu_quark, GKSU_CONTEXT_ERROR_NOPASSWORD,
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   893
+					_("No password was supplied and sudo needs it."));
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   894
+				fprintf (outfile, "\n");
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   895
+	      			sudo_reset_xauth (context, xauth, xauth_env);
15661
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   896
+	      			sudo_reset_home_dir (home_env);
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   897
+	      			return -1;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   898
+	    		  }
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   899
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   900
+			write (child_pipe[1], context->password, strlen(context->password));
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   901
+			embedded_su_conv = TRUE;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   902
+			break;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   903
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   904
+		default:
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   905
+			embedded_su_conv = TRUE;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   906
+			break;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   907
+	  }
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   908
+
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   909
+	  if (!embedded_su_conv)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   910
+		{
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   911
+		  if (context->debug)
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   912
+		    fprintf (stderr, "I'm going to break!\n");
14761
ada30a14249c 2008-12-12 Jim Li <[email protected]>
jim
parents: 14430
diff changeset
   913
+
ada30a14249c 2008-12-12 Jim Li <[email protected]>
jim
parents: 14430
diff changeset
   914
+      		  if (context->msg_type == ES_ERROR && context->msg_num > 0 && context->message[0].msg != NULL)
ada30a14249c 2008-12-12 Jim Li <[email protected]>
jim
parents: 14430
diff changeset
   915
+		   {
15575
04e7b73db54f 2009-04-07 Takao Fujiwara <[email protected]>
fujiwara
parents: 14761
diff changeset
   916
+		     gchar *utf8 = NULL;
04e7b73db54f 2009-04-07 Takao Fujiwara <[email protected]>
fujiwara
parents: 14761
diff changeset
   917
+
04e7b73db54f 2009-04-07 Takao Fujiwara <[email protected]>
fujiwara
parents: 14761
diff changeset
   918
+		     utf8 = g_locale_to_utf8 (context->message[0].msg, -1,
04e7b73db54f 2009-04-07 Takao Fujiwara <[email protected]>
fujiwara
parents: 14761
diff changeset
   919
+		                              NULL, NULL, NULL);
04e7b73db54f 2009-04-07 Takao Fujiwara <[email protected]>
fujiwara
parents: 14761
diff changeset
   920
+		     if (utf8 == NULL)
04e7b73db54f 2009-04-07 Takao Fujiwara <[email protected]>
fujiwara
parents: 14761
diff changeset
   921
+		       utf8 = g_strdup (context->message[0].msg);
14761
ada30a14249c 2008-12-12 Jim Li <[email protected]>
jim
parents: 14430
diff changeset
   922
+		     g_set_error (error, gksu_quark, GKSU_CONTEXT_ERROR_WRONGPASS,
15575
04e7b73db54f 2009-04-07 Takao Fujiwara <[email protected]>
fujiwara
parents: 14761
diff changeset
   923
+				  utf8);
04e7b73db54f 2009-04-07 Takao Fujiwara <[email protected]>
fujiwara
parents: 14761
diff changeset
   924
+		     g_free (utf8);
14761
ada30a14249c 2008-12-12 Jim Li <[email protected]>
jim
parents: 14430
diff changeset
   925
+		   }
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   926
+		  break;
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   927
+		}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   928
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   929
+	}
14761
ada30a14249c 2008-12-12 Jim Li <[email protected]>
jim
parents: 14430
diff changeset
   930
+
ada30a14249c 2008-12-12 Jim Li <[email protected]>
jim
parents: 14430
diff changeset
   931
+
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   932
+      if (!context->wait_for_child_to_exit) {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   933
+	return FALSE; 
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   934
+	}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   935
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   936
+      /* make sure we did read everything */
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   937
+      while (1)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   938
+	{
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   939
+
9819
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
   940
+	  bzero(buffer, MAX_BUFFER_SIZE);
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
   941
+	  if(!fgets (buffer, MAX_BUFFER_SIZE-1, infile))
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   942
+	    break;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   943
+	  fprintf (stderr, "%s", buffer);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   944
+	  fflush (stderr);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   945
+	}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   946
+      
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   947
+      sudo_reset_xauth (context, xauth, xauth_env);
15661
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
   948
+      sudo_reset_home_dir (home_env);
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   949
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   950
+      if (WIFEXITED(status))
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   951
+	{
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   952
+	  if (WEXITSTATUS(status))
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   953
+	    {
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   954
+	      if (auth_failed)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   955
+		g_set_error (error, gksu_quark, GKSU_CONTEXT_ERROR_WRONGPASS,
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   956
+			     _("Wrong password."));
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   957
+	      else
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   958
+		g_set_error (error, gksu_quark, GKSU_CONTEXT_ERROR_CHILDFAILED,
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   959
+			     _("Child terminated with %d status"),
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   960
+			     WEXITSTATUS(status));
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   961
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   962
+	      return TRUE;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   963
+	    }
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   964
+	}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   965
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   966
+    }
14761
ada30a14249c 2008-12-12 Jim Li <[email protected]>
jim
parents: 14430
diff changeset
   967
+
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   968
+  return FALSE;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   969
+}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   970
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   971
+gboolean
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   972
+gksu_context_try_need_password (GksuContext *context)
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   973
+{
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   974
+  if ( (context->elevated_privilege) && (gksu_context_pfexec_try_run (context)))
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   975
+    {
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   976
+	if (context->debug)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   977
+		fprintf (stderr, "Enter pfexec mode!\n");
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   978
+	context->pfexec_mode = TRUE;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   979
+	return FALSE;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   980
+    } else
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   981
+    {
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   982
+	context->pfexec_mode = FALSE;
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   983
+	if ( context->debug ) 
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   984
+		fprintf (stderr, "Enter embedded_su mode!\n");
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   985
+	if ( context->elevated_role )
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   986
+		gksu_context_set_role (context);
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   987
+	if (context->debug)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   988
+		fprintf (stderr, "Current role = %s\n", context->user);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   989
+	return gksu_context_embedded_su_try_need_password (context);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   990
+    }
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   991
+}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   992
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   993
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   994
+gboolean
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
   995
+gksu_context_run (GksuContext *context, GError **error)
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   996
+{
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   997
+  if (context->pfexec_mode)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   998
+	gksu_context_pfexec_run (context, error);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
   999
+  else 
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1000
+	gksu_context_embedded_su_run (context, error);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1001
+}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1002
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1003
+gboolean
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1004
+gksu_context_pfexec_try_run (GksuContext *context)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1005
+{
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1006
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1007
+        struct passwd *pwd;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1008
+	gint ruid;
11932
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1009
+        char command_line[MAX_BUFFER_SIZE];
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1010
+	char *path, *dir, full_cmd[MAX_BUFFER_SIZE];
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1011
+	int i;
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1012
+	execattr_t *exec;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1013
+
11932
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1014
+	exec = NULL;
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1015
+	ruid = getuid();
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1016
+        pwd = getpwuid(ruid);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1017
+        if (pwd == NULL) {
11932
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1018
+                /* fail if we cannot get password entry */
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1019
+                return FALSE;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1020
+        }
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1021
+
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1022
+	for (i=0; ; i++) {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1023
+	  if (context->command[i] == ' ' || context->command[i] == '\0') {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1024
+		command_line[i] = '\0';
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1025
+		break;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1026
+	  } else {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1027
+		command_line[i] = context->command[i];
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1028
+	  }
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1029
+	}
11932
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1030
+	if (strchr(command_line, '/') != NULL) {
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1031
+		exec = getexecuser (pwd->pw_name, KV_COMMAND, command_line, GET_ALL);
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1032
+	} else {
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1033
+		path = getenv("PATH");
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1034
+		if ( path != NULL ) {
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1035
+			/* we need to copy $PATH because our sub processes may need it. */
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1036
+			path = strdup(path);
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1037
+			for (dir= strtok(path, ":"); dir; dir = strtok(NULL, ":")) {
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1038
+				if (snprintf(full_cmd, sizeof(full_cmd), "%s/%s", dir, command_line) >= sizeof(full_cmd)) {
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1039
+					continue;
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1040
+				}
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1041
+				if (access(full_cmd, X_OK) == 0) {
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1042
+					exec = getexecuser (pwd->pw_name, KV_COMMAND, full_cmd, GET_ALL);
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1043
+					break;
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1044
+				}
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1045
+			}
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1046
+			free(path);
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1047
+		}
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1048
+	} 
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1049
+	if (exec == NULL) {
10224
d50ed19b02ec 2007-07-26 Jim Li <[email protected]>
jim
parents: 9819
diff changeset
  1050
+		if (context->debug) fprintf (stderr, "Error getting exec attr\n");
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1051
+		return FALSE;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1052
+	}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1053
+	
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1054
+	while (exec != NULL) {
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1055
+		if (context->debug) 
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1056
+		{
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1057
+			fprintf (stderr, "Exec Name: %s\n", exec->name);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1058
+			fprintf (stderr,"Policy Name: %s\n", exec->policy);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1059
+			fprintf (stderr, "Exec Type: %s\n", exec->type);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1060
+			fprintf (stderr, "Exec Id: %s\n", exec->id);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1061
+		}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1062
+		if ((exec->attr != NULL) && (exec->attr->length != 0)) {
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1063
+			return TRUE;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1064
+		}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1065
+		exec = exec->next;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1066
+	}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1067
+	return FALSE;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1068
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1069
+}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1070
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1071
+gboolean
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1072
+gksu_context_set_role (GksuContext *context)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1073
+{
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1074
+        struct passwd *pwd;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1075
+	gint ruid;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1076
+	execattr_t    *exec;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1077
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1078
+	char           *rolelist = NULL;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1079
+	userattr_t     *user;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1080
+	char	       *username;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1081
+	char 	       *rolename;
11932
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1082
+	char	       command_line[MAX_BUFFER_SIZE];
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1083
+	int i;
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1084
+
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1085
+	
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1086
+	if ( !strncmp (context->user, "root", 4) ) {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1087
+		ruid = getuid();
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1088
+ 		pwd = getpwuid(ruid);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1089
+		if (pwd == NULL) {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1090
+		// can't get pwd
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1091
+			return FALSE;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1092
+		}
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1093
+		username = strdup (pwd->pw_name);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1094
+		user = getusernam (username);
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1095
+	}
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1096
+	else {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1097
+		user = getusernam (context->user);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1098
+	}
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1099
+	if (user != NULL) {
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1100
+		rolelist = kva_match (user->attr, USERATTR_ROLES_KW);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1101
+		if (rolelist != NULL) {
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1102
+		} else {
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1103
+			return FALSE;	
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1104
+		}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1105
+	} else {
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1106
+	// Can't get userattr
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1107
+		return FALSE;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1108
+	}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1109
+
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1110
+	for (i=0; ; i++) {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1111
+	  if (context->command[i] == ' ' || context->command[i] == '\0') {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1112
+		command_line[i] = '\0';
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1113
+		break;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1114
+	  } else {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1115
+		command_line[i] = context->command[i];
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1116
+	  }
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1117
+	}
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1118
+	/* Parse the rolename from the list and check execution profiles for
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1119
+	 * each role 
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1120
+         */	
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1121
+	rolename = strtok (rolelist, ",");
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1122
+	while (rolename) {
11932
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1123
+		exec = getexecuser (rolename, KV_COMMAND, command_line, GET_ALL);
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1124
+        	while (exec != NULL) {
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1125
+                	if ((exec->attr != NULL) && (exec->attr->length != 0)) {
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1126
+				if (context->debug) {
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1127
+	                        	printf ("Command in profile and has attributes\n");
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1128
+        	        		printf ("Exec Name: %s\n", exec->name);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1129
+                			printf ("Policy Name: %s\n", exec->policy);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1130
+                			printf ("Exec Type: %s\n", exec->type);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1131
+                			printf ("Exec Id: %s\n", exec->id);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1132
+				}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1133
+				if (context->user != NULL) g_free (context->user);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1134
+				context->user = g_strdup (rolename);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1135
+				return TRUE;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1136
+                	}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1137
+                	exec = exec->next;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1138
+		}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1139
+		rolename = strtok (NULL, ",");
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1140
+	}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1141
+}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1142
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1143
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1144
+gboolean
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1145
+gksu_context_pfexec_run (GksuContext *context, GError **error)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1146
+{
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1147
+  char **cmd;
11932
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1148
+  char buffer[MAX_BUFFER_SIZE];
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1149
+  int argcount = 8;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1150
+  int i, j;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1151
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1152
+  GQuark gksu_quark;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1153
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1154
+  gchar *xauth = NULL, 
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1155
+    *xauth_env = NULL;
15661
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
  1156
+  gchar *home = NULL,
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
  1157
+    *home_env = NULL;
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1158
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1159
+  pid_t pid;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1160
+  int status;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1161
+  size_t r;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1162
+  FILE *infile, *outfile;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1163
+  int parent_pipe[2];	/* For talking to the parent */
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1164
+  int child_pipe[2];	/* For talking to the child */
11932
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1165
+  int was_quoted = FALSE;
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1166
+  
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1167
+  gksu_quark = g_quark_from_string (PACKAGE_NAME);
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1168
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1169
+  if (!context->command)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1170
+    {
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1171
+      g_set_error (error, gksu_quark, GKSU_CONTEXT_ERROR_NOCOMMAND,
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1172
+		   _("gksu_sudo_run needs a command to be run, "
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1173
+		     "none was provided."));
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1174
+      return -1;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1175
+    }
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1176
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1177
+  /* 
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1178
+     FIXME: need to check if we are in X
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1179
+  */
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1180
+  if (sudo_prepare_xauth (context) == 1)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1181
+    {
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1182
+      g_set_error (error, gksu_quark, GKSU_CONTEXT_ERROR_XAUTH,
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1183
+		   _("Unable to copy the user's Xauthorization file."));
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1184
+      return -1;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1185
+    }
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1186
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1187
+  /* sets XAUTHORITY */
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1188
+  xauth = g_strdup_printf ("%s/.Xauthority", context->dir);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1189
+  xauth_env = getenv ("XAUTHORITY");
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1190
+  setenv ("XAUTHORITY", xauth, TRUE);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1191
+
15661
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
  1192
+  /*
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
  1193
+   * Check if the HOME environment variable is set in the user's
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
  1194
+   * environment. If so unset it:
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
  1195
+   * This will ensure that apps that require write
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
  1196
+   * permission eg. gconf client applications, will work.
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
  1197
+   */
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
  1198
+  home_env = getenv ("HOME");
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
  1199
+  home = sudo_get_home_dir (context);
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
  1200
+  setenv ("HOME", home, TRUE);
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
  1201
+
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1202
+  if (context->debug)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1203
+   {
15661
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
  1204
+    fprintf (stderr, "HOME: %s\n", home);
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1205
+    fprintf (stderr, "xauth: %s\n", xauth);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1206
+   }
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1207
+
15661
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
  1208
+  g_free(home);
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1209
+  cmd = g_new (gchar *, argcount + 1);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1210
+  
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1211
+  argcount = 0;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1212
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1213
+  /* pfexec binary */
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1214
+  cmd[argcount] = g_strdup("/usr/bin/pfexec");
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1215
+  argcount++;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1216
+
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1217
+  if (context->privspec != NULL)
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1218
+    {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1219
+      cmd[argcount] = g_strdup("-P");
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1220
+      argcount++;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1221
+      cmd[argcount] = g_strdup(context->privspec);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1222
+      argcount++;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1223
+    }
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1224
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1225
+  for (i = j = 0; ; i++)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1226
+    {
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1227
+      if (context->command[i] == ' ' || context->command[i] == '\0')
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1228
+	{
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1229
+	  buffer[j] = '\0';
11932
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1230
+	  /* Strip the previously added quoting '<arg>' */
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1231
+	  if (was_quoted && j > 1 && buffer[j-1] == '\'')
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1232
+	    {
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1233
+	     buffer[j-1] = '\0';
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1234
+	     was_quoted = FALSE;
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1235
+	    }
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1236
+	  cmd = g_realloc (cmd, sizeof(gchar*) * (argcount + 1));
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1237
+	  cmd[argcount] = g_strdup (buffer);
11932
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1238
+	  bzero (buffer, MAX_BUFFER_SIZE);
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1239
+	  argcount = argcount + 1;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1240
+	  j = 0;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1241
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1242
+	  if (context->command[i] == '\0')
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1243
+	    break;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1244
+	}
11932
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1245
+      else if ( j == 0 && context->command[i] == '\'' )
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1246
+	{
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1247
+	  was_quoted = TRUE;
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1248
+	  /* Skip initial quote */
141b1aac1459 2008-03-27 Jim.Li <[email protected]>
jim
parents: 10224
diff changeset
  1249
+	}
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1250
+      else
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1251
+	{
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1252
+	  if (context->command[i] == '\\')
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1253
+	    i = i + 1;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1254
+	  buffer[j] = context->command[i];
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1255
+	  j = j + 1;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1256
+	}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1257
+    }
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1258
+  cmd = g_realloc (cmd, sizeof(gchar*) * (argcount + 1));
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1259
+  cmd[argcount] = NULL;
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1260
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1261
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1262
+  if (context->debug)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1263
+    {
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1264
+      for (i = 0; cmd[i] != NULL; i++)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1265
+	fprintf (stderr, "cmd[%d]: %s\n", i, cmd[i]);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1266
+    }
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1267
+
14430
969b5f184948 2008-10-09 Jim Li <[email protected]>
jim
parents: 14422
diff changeset
  1268
+  if (context->need_pipe)
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1269
+    {
14422
6bf888d69494 2008-10-07 Jim Li <[email protected]>
jim
parents: 11932
diff changeset
  1270
+      if ((pipe(parent_pipe)) == -1)
6bf888d69494 2008-10-07 Jim Li <[email protected]>
jim
parents: 11932
diff changeset
  1271
+        {
6bf888d69494 2008-10-07 Jim Li <[email protected]>
jim
parents: 11932
diff changeset
  1272
+          g_set_error (error, gksu_quark, GKSU_CONTEXT_ERROR_PIPE,
6bf888d69494 2008-10-07 Jim Li <[email protected]>
jim
parents: 11932
diff changeset
  1273
+                       _("Error creating pipe: %s"),
6bf888d69494 2008-10-07 Jim Li <[email protected]>
jim
parents: 11932
diff changeset
  1274
+                       strerror(errno));
6bf888d69494 2008-10-07 Jim Li <[email protected]>
jim
parents: 11932
diff changeset
  1275
+          sudo_reset_xauth (context, xauth, xauth_env);
15661
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
  1276
+          sudo_reset_home_dir (home_env);
14422
6bf888d69494 2008-10-07 Jim Li <[email protected]>
jim
parents: 11932
diff changeset
  1277
+          return -1;
6bf888d69494 2008-10-07 Jim Li <[email protected]>
jim
parents: 11932
diff changeset
  1278
+        }
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1279
+
14422
6bf888d69494 2008-10-07 Jim Li <[email protected]>
jim
parents: 11932
diff changeset
  1280
+      if ((pipe(child_pipe)) == -1)
6bf888d69494 2008-10-07 Jim Li <[email protected]>
jim
parents: 11932
diff changeset
  1281
+        {
6bf888d69494 2008-10-07 Jim Li <[email protected]>
jim
parents: 11932
diff changeset
  1282
+          g_set_error (error, gksu_quark, GKSU_CONTEXT_ERROR_PIPE,
6bf888d69494 2008-10-07 Jim Li <[email protected]>
jim
parents: 11932
diff changeset
  1283
+                       _("Error creating pipe: %s"),
6bf888d69494 2008-10-07 Jim Li <[email protected]>
jim
parents: 11932
diff changeset
  1284
+                       strerror(errno));
6bf888d69494 2008-10-07 Jim Li <[email protected]>
jim
parents: 11932
diff changeset
  1285
+          sudo_reset_xauth (context, xauth, xauth_env);
15661
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
  1286
+          sudo_reset_home_dir (home_env);
14422
6bf888d69494 2008-10-07 Jim Li <[email protected]>
jim
parents: 11932
diff changeset
  1287
+          return -1;
6bf888d69494 2008-10-07 Jim Li <[email protected]>
jim
parents: 11932
diff changeset
  1288
+        }
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1289
+    }
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1290
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1291
+  pid = fork();
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1292
+  if (pid == -1)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1293
+    {
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1294
+      g_set_error (error, gksu_quark, GKSU_CONTEXT_ERROR_FORK,
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1295
+		   _("Failed to fork new process: %s"),
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1296
+		   strerror(errno));
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1297
+      sudo_reset_xauth (context, xauth, xauth_env);
15661
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
  1298
+      sudo_reset_home_dir (home_env);
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1299
+      return -1;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1300
+    }
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1301
+  else if (pid == 0) 
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1302
+    {
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1303
+      // Child
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1304
+      setsid();   // make us session leader
14430
969b5f184948 2008-10-09 Jim Li <[email protected]>
jim
parents: 14422
diff changeset
  1305
+      if (context->need_pipe)
14422
6bf888d69494 2008-10-07 Jim Li <[email protected]>
jim
parents: 11932
diff changeset
  1306
+        {
6bf888d69494 2008-10-07 Jim Li <[email protected]>
jim
parents: 11932
diff changeset
  1307
+          close(child_pipe[1]);
6bf888d69494 2008-10-07 Jim Li <[email protected]>
jim
parents: 11932
diff changeset
  1308
+          dup2(child_pipe[0], STDIN_FILENO);
6bf888d69494 2008-10-07 Jim Li <[email protected]>
jim
parents: 11932
diff changeset
  1309
+          dup2(parent_pipe[1], STDERR_FILENO);
6bf888d69494 2008-10-07 Jim Li <[email protected]>
jim
parents: 11932
diff changeset
  1310
+          dup2(parent_pipe[1], STDOUT_FILENO);
6bf888d69494 2008-10-07 Jim Li <[email protected]>
jim
parents: 11932
diff changeset
  1311
+        }
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1312
+      
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1313
+      execv(cmd[0], cmd);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1314
+      
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1315
+      g_set_error (error, gksu_quark, GKSU_CONTEXT_ERROR_EXEC,
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1316
+		   _("Failed to exec new process: %s"),
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1317
+		   strerror(errno));
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1318
+      sudo_reset_xauth (context, xauth, xauth_env);
15661
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
  1319
+      sudo_reset_home_dir (home_env);
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1320
+      return -1;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1321
+    } 
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1322
+  else 
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1323
+    {
14430
969b5f184948 2008-10-09 Jim Li <[email protected]>
jim
parents: 14422
diff changeset
  1324
+      if (!context->need_pipe)
14422
6bf888d69494 2008-10-07 Jim Li <[email protected]>
jim
parents: 11932
diff changeset
  1325
+	return FALSE;
6bf888d69494 2008-10-07 Jim Li <[email protected]>
jim
parents: 11932
diff changeset
  1326
+
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1327
+      gboolean auth_failed = FALSE;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1328
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1329
+      // Parent
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1330
+      close(parent_pipe[1]);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1331
+      
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1332
+      infile = fdopen(parent_pipe[0], "r");
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1333
+      if (!infile)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1334
+	{
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1335
+	  g_set_error (error, gksu_quark, GKSU_CONTEXT_ERROR_PIPE,
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1336
+		       _("Error opening pipe: %s"),
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1337
+		       strerror(errno));
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1338
+	  sudo_reset_xauth (context, xauth, xauth_env);
15661
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
  1339
+	  sudo_reset_home_dir (home_env);
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1340
+	  return -1;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1341
+	}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1342
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1343
+      outfile = fdopen(child_pipe[1], "w");
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1344
+      if (!outfile)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1345
+	{
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1346
+	  g_set_error (error, gksu_quark, GKSU_CONTEXT_ERROR_PIPE,
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1347
+		       _("Error opening pipe: %s"),
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1348
+		       strerror(errno));
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1349
+	  sudo_reset_xauth (context, xauth, xauth_env);
15661
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
  1350
+	  sudo_reset_home_dir (home_env);
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1351
+	  return -1;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1352
+	}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1353
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1354
+      context->stdin_fd = parent_pipe[0];
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1355
+      context->stdout_fd = child_pipe[1];
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1356
+      context->stdin_file = infile;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1357
+      context->stdout_file = outfile;
10224
d50ed19b02ec 2007-07-26 Jim Li <[email protected]>
jim
parents: 9819
diff changeset
  1358
+      setvbuf (context->stdin_file, NULL, _IONBF, 0);
d50ed19b02ec 2007-07-26 Jim Li <[email protected]>
jim
parents: 9819
diff changeset
  1359
+      fcntl (context->stdin_fd, F_SETFL, 0);	
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1360
+      context->child_pid = pid;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1361
+
14430
969b5f184948 2008-10-09 Jim Li <[email protected]>
jim
parents: 14422
diff changeset
  1362
+      if (!context->wait_for_child_to_exit)
969b5f184948 2008-10-09 Jim Li <[email protected]>
jim
parents: 14422
diff changeset
  1363
+        return FALSE;
969b5f184948 2008-10-09 Jim Li <[email protected]>
jim
parents: 14422
diff changeset
  1364
+
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1365
+      /* make sure we did read everything */
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1366
+      while (1)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1367
+	{
9819
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
  1368
+	  bzero(buffer, MAX_BUFFER_SIZE);
58c19754e618 2007-05-02 Darren Kenny <[email protected]>
dkenny
parents: 9768
diff changeset
  1369
+	  if(!fread (buffer, sizeof(gchar), MAX_BUFFER_SIZE-1, infile))
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1370
+	    break;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1371
+	  fprintf (stderr, "%s", buffer);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1372
+	  fflush (stderr);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1373
+	}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1374
+      
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1375
+      sudo_reset_xauth (context, xauth, xauth_env);
15661
f58ccd5549a4 2009-04-21 Niall Power <[email protected]>
niall
parents: 15575
diff changeset
  1376
+      sudo_reset_home_dir (home_env);
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1377
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1378
+      if (WIFEXITED(status))
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1379
+	{
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1380
+	  if (WEXITSTATUS(status))
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1381
+	    {
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1382
+	      if (auth_failed)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1383
+		g_set_error (error, gksu_quark, GKSU_CONTEXT_ERROR_WRONGPASS,
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1384
+			     _("Wrong password."));
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1385
+	      else
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1386
+		g_set_error (error, gksu_quark, GKSU_CONTEXT_ERROR_CHILDFAILED,
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1387
+			     _("Child terminated with %d status"),
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1388
+			     WEXITSTATUS(status));
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1389
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1390
+	      return TRUE;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1391
+	    }
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1392
+	}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1393
+    }
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1394
+  
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1395
+  return FALSE;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1396
+}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1397
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1398
+int 
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1399
+gksu_context_get_child_stdin_fd (GksuContext *context)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1400
+{
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1401
+	return context->stdin_fd;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1402
+}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1403
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1404
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1405
+int 
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1406
+gksu_context_get_child_stdout_fd (GksuContext *context)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1407
+{
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1408
+	return context->stdout_fd;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1409
+}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1410
+
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1411
+FILE* 
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1412
+gksu_context_get_child_stdin_file (GksuContext *context)
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1413
+{
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1414
+	return context->stdin_file;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1415
+}
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1416
+
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1417
+
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1418
+FILE*
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1419
+gksu_context_get_child_stdout_file (GksuContext *context)
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1420
+{
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1421
+	return context->stdout_file;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1422
+}
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1423
+
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1424
+pid_t
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1425
+gksu_context_get_child_pid (GksuContext *context)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1426
+{
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1427
+	return context->child_pid;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1428
+}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1429
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1430
+void
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1431
+gksu_context_set_wait_for_child_to_exit (GksuContext *context, gboolean value)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1432
+{
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1433
+	context->wait_for_child_to_exit = value;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1434
+}
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1435
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1436
+gboolean
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1437
+gksu_context_get_wait_for_child_to_exit (GksuContext *context)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1438
+{
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1439
+	return context->wait_for_child_to_exit;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1440
+}
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1441
+
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1442
+void
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1443
+gksu_context_set_elevated_privilege (GksuContext *context, gboolean value)
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1444
+{
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1445
+	context->elevated_privilege = value;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1446
+}
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1447
+
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1448
+gboolean
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1449
+gksu_context_get_elevated_privilege (GksuContext *context)
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1450
+{
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1451
+	return context->elevated_privilege;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1452
+}
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1453
+
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1454
+void
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1455
+gksu_context_set_elevated_role (GksuContext *context, gboolean value)
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1456
+{
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1457
+	context->elevated_role = value;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1458
+}
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1459
+
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1460
+gboolean
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1461
+gksu_context_get_elevated_role (GksuContext *context)
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1462
+{
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1463
+	return context->elevated_role;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1464
+}
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1465
+
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1466
+/**
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1467
+ * gksu_context_set_privspec:
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1468
+ * @context: the #GksuContext you want to modify
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1469
+ * @privspec: the target privileges specification
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1470
+ *
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1471
+ * Sets up privileges specification used by pfexec .
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1472
+ *
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1473
+ */
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1474
+void
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1475
+gksu_context_set_privspec (GksuContext *context, gchar *privspec)
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1476
+{
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1477
+  g_assert (privspec != NULL);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1478
+
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1479
+  if (context->privspec)
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1480
+    g_free (context->privspec);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1481
+  context->privspec = g_strdup (privspec);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1482
+}
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1483
+
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1484
+/**
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1485
+ * gksu_context_get_privspec:
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1486
+ * @context: the #GksuContext from which to grab the information
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1487
+ *
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1488
+ * Gets the privileges specification used by pfexec, as set 
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1489
+ * by gksu_context_set_privspec.
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1490
+ *
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1491
+ * Returns: a pointer to the string containing the privileges specification.
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1492
+ */
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1493
+const gchar*
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1494
+gksu_context_get_privspec (GksuContext *context)
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1495
+{
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1496
+  return context->privspec;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1497
+}
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1498
+
9768
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1499
+/**
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1500
+ * gksu_context_get_pam_num_msg:
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1501
+ * @context: the #GksuContext from which to grab the information
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1502
+ *
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1503
+ * Gets the privileges specificddation used by pfexec, as set 
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1504
+ * by gksu_context_set_privspec.
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1505
+ *
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1506
+ * Returns: number of pam conversation.
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1507
+ */
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1508
+const gint
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1509
+gksu_context_get_pam_msg_num (GksuContext *context)
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1510
+{
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1511
+  return context->msg_num;
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1512
+}
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1513
+
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1514
+/**
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1515
+ * gksu_context_get_pam_message:
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1516
+ * @context: the #GksuContext from which to grab the information
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1517
+ *
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1518
+ * 
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1519
+ *
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1520
+ * Returns: a pointer to the string containing the specific pam message.
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1521
+ */
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1522
+const gchar*
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1523
+gksu_context_get_pam_message (GksuContext *context, gint index)
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1524
+{
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1525
+  return context->message[index].msg;
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1526
+}
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1527
+
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1528
+/**
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1529
+ * gksu_context_get_pam_response:
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1530
+ * @context: the #GksuContext from which to grab the information
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1531
+ *
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1532
+ * 
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1533
+ *
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1534
+ * Returns: a pointer to the string containing the specified pam response.
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1535
+ */
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1536
+const gchar*
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1537
+gksu_context_get_pam_response (GksuContext *context, gint index)
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1538
+{
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1539
+  return context->response[index].resp;
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1540
+}
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1541
+
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1542
+/**
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1543
+ * gksu_context_set_pam_response:
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1544
+ * @context: the #GksuContext from which to grab the information
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1545
+ *
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1546
+ * 
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1547
+ *
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1548
+ * Returns: void.
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1549
+ */
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1550
+
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1551
+void
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1552
+gksu_context_set_pam_response (GksuContext *context, gint index, gchar *response)
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1553
+{
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1554
+  context->response[index].resp = g_strdup (response);
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1555
+}
14422
6bf888d69494 2008-10-07 Jim Li <[email protected]>
jim
parents: 11932
diff changeset
  1556
+
6bf888d69494 2008-10-07 Jim Li <[email protected]>
jim
parents: 11932
diff changeset
  1557
+gboolean
6bf888d69494 2008-10-07 Jim Li <[email protected]>
jim
parents: 11932
diff changeset
  1558
+gksu_context_get_pfexec_mode (GksuContext *context)
6bf888d69494 2008-10-07 Jim Li <[email protected]>
jim
parents: 11932
diff changeset
  1559
+{
6bf888d69494 2008-10-07 Jim Li <[email protected]>
jim
parents: 11932
diff changeset
  1560
+	return context->pfexec_mode;
6bf888d69494 2008-10-07 Jim Li <[email protected]>
jim
parents: 11932
diff changeset
  1561
+}
6bf888d69494 2008-10-07 Jim Li <[email protected]>
jim
parents: 11932
diff changeset
  1562
+
14430
969b5f184948 2008-10-09 Jim Li <[email protected]>
jim
parents: 14422
diff changeset
  1563
+void
969b5f184948 2008-10-09 Jim Li <[email protected]>
jim
parents: 14422
diff changeset
  1564
+gksu_context_set_need_pipe (GksuContext *context, gboolean value)
969b5f184948 2008-10-09 Jim Li <[email protected]>
jim
parents: 14422
diff changeset
  1565
+{
969b5f184948 2008-10-09 Jim Li <[email protected]>
jim
parents: 14422
diff changeset
  1566
+	context->need_pipe = value;
969b5f184948 2008-10-09 Jim Li <[email protected]>
jim
parents: 14422
diff changeset
  1567
+}
969b5f184948 2008-10-09 Jim Li <[email protected]>
jim
parents: 14422
diff changeset
  1568
+
969b5f184948 2008-10-09 Jim Li <[email protected]>
jim
parents: 14422
diff changeset
  1569
+gboolean
969b5f184948 2008-10-09 Jim Li <[email protected]>
jim
parents: 14422
diff changeset
  1570
+gksu_context_get_need_pipe (GksuContext *context)
969b5f184948 2008-10-09 Jim Li <[email protected]>
jim
parents: 14422
diff changeset
  1571
+{
969b5f184948 2008-10-09 Jim Li <[email protected]>
jim
parents: 14422
diff changeset
  1572
+  	return context->need_pipe;
969b5f184948 2008-10-09 Jim Li <[email protected]>
jim
parents: 14422
diff changeset
  1573
+}
969b5f184948 2008-10-09 Jim Li <[email protected]>
jim
parents: 14422
diff changeset
  1574
+
14761
ada30a14249c 2008-12-12 Jim Li <[email protected]>
jim
parents: 14430
diff changeset
  1575
diff -ru libgksu1.2-1.3.1.orig/libgksu/gksu-context.h libgksu1.2-1.3.1/libgksu/gksu-context.h
ada30a14249c 2008-12-12 Jim Li <[email protected]>
jim
parents: 14430
diff changeset
  1576
--- libgksu1.2-1.3.1.orig/libgksu/gksu-context.h	2005-06-15 21:49:54.000000000 +0800
ada30a14249c 2008-12-12 Jim Li <[email protected]>
jim
parents: 14430
diff changeset
  1577
+++ libgksu1.2-1.3.1/libgksu/gksu-context.h	2008-12-12 14:18:30.105150000 +0800
ada30a14249c 2008-12-12 Jim Li <[email protected]>
jim
parents: 14430
diff changeset
  1578
@@ -23,6 +23,17 @@
9768
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1579
 
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1580
 #include <glib.h>
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1581
 #include <glib-object.h>
9768
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1582
+#include <security/pam_appl.h>
14761
ada30a14249c 2008-12-12 Jim Li <[email protected]>
jim
parents: 14430
diff changeset
  1583
+
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1584
+#ifdef __sun
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1585
+#include <exec_attr.h>
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1586
+#include <user_attr.h>
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1587
+#include <auth_attr.h>
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1588
+#include <prof_attr.h>
9768
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1589
+#define ES_SUCCESS 1
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1590
+#define ES_ERROR 2
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1591
+#define ES_PASSWORD 3
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1592
+#endif
14761
ada30a14249c 2008-12-12 Jim Li <[email protected]>
jim
parents: 14430
diff changeset
  1593
 
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1594
 #define GKSU_TYPE_CONTEXT (gksu_context_get_type ())
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1595
 #define GKSU_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GKSU_TYPE_CONTEXT, GksuContext))
9768
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1596
@@ -31,6 +42,8 @@
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1597
 #define GKSU_IS_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GKSU_TYPE_CONTEXT))
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1598
 #define GKSU_CONTEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GKSU_TYPE_CONTEXT, GksuContextClass))
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1599
 
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1600
+/* Valid PAM embedded_su request codes. */
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1601
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1602
 G_BEGIN_DECLS
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1603
 
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1604
 typedef enum
14430
969b5f184948 2008-10-09 Jim Li <[email protected]>
jim
parents: 14422
diff changeset
  1605
@@ -91,6 +104,22 @@
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1606
 
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1607
   gboolean debug;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1608
   gboolean ssh_fwd;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1609
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1610
+  int msg_type;
9768
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1611
+  int msg_num;
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1612
+  struct pam_message *message;
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1613
+  struct pam_response *response;
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1614
+  gchar *privspec;
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1615
+  gboolean pfexec_mode;
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1616
+  gboolean elevated_privilege;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1617
+  gboolean elevated_role;
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1618
+  gboolean wait_for_child_to_exit;
14430
969b5f184948 2008-10-09 Jim Li <[email protected]>
jim
parents: 14422
diff changeset
  1619
+  gboolean need_pipe;
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1620
+  int child_pid;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1621
+  int stdin_fd;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1622
+  int stdout_fd;
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1623
+  FILE *stdin_file;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1624
+  FILE *stdout_file;
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1625
 };
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1626
 
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1627
 struct _GksuContextClass
14430
969b5f184948 2008-10-09 Jim Li <[email protected]>
jim
parents: 14422
diff changeset
  1628
@@ -135,11 +164,13 @@
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1629
 gboolean
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1630
 gksu_context_get_login_shell (GksuContext *context);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1631
 
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1632
+#ifndef __sun
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1633
 void
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1634
 gksu_context_set_keep_env (GksuContext *context, gboolean value);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1635
 
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1636
 gboolean
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1637
 gksu_context_get_keep_env (GksuContext *context);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1638
+#endif
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1639
 
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1640
 void
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1641
 gksu_context_set_debug (GksuContext *context, gboolean value);
14430
969b5f184948 2008-10-09 Jim Li <[email protected]>
jim
parents: 14422
diff changeset
  1642
@@ -147,11 +178,13 @@
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1643
 gboolean
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1644
 gksu_context_get_debug (GksuContext *context);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1645
 
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1646
+#ifndef __sun
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1647
 void
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1648
 gksu_context_set_ssh_fwd (GksuContext *context, gboolean value);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1649
 
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1650
 gboolean
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1651
 gksu_context_get_ssh_fwd (GksuContext *context);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1652
+#endif
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1653
 
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1654
 GType
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1655
 gksu_context_get_type (void);
14430
969b5f184948 2008-10-09 Jim Li <[email protected]>
jim
parents: 14422
diff changeset
  1656
@@ -168,6 +201,83 @@
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1657
 gboolean
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1658
 gksu_context_sudo_run (GksuContext *context, GError **error);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1659
 
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1660
+#ifdef __sun
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1661
+gboolean
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1662
+gksu_context_embedded_su_try_need_password (GksuContext *context);
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1663
+#endif
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1664
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1665
+gboolean
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1666
+gksu_context_embedded_su_run (GksuContext *context, GError **error);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1667
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1668
+gboolean
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1669
+gksu_context_pfexec_try_run (GksuContext *context);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1670
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1671
+gboolean
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1672
+gksu_context_pfexec_run (GksuContext *context, GError **error);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1673
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1674
+gboolean
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1675
+gksu_context_set_role (GksuContext *context);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1676
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1677
+int 
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1678
+gksu_context_get_child_stdin_fd (GksuContext *context);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1679
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1680
+int 
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1681
+gksu_context_get_child_stdout_fd (GksuContext *context);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1682
+
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1683
+FILE* 
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1684
+gksu_context_get_child_stdin_file (GksuContext *context);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1685
+
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1686
+FILE*  
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1687
+gksu_context_get_child_stdout_file (GksuContext *context);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1688
+
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1689
+pid_t
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1690
+gksu_context_get_child_pid (GksuContext *context);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1691
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1692
+void
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1693
+gksu_context_set_wait_for_child_to_exit (GksuContext *context, gboolean value);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1694
+
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1695
+gboolean
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1696
+gksu_context_get_wait_for_child_to_exit (GksuContext *context);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1697
+
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1698
+void
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1699
+gksu_context_set_elevated_privilege (GksuContext *context, gboolean value);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1700
+
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1701
+gboolean
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1702
+gksu_context_get_elevated_privilege (GksuContext *context);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1703
+
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1704
+void
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1705
+gksu_context_set_elevated_role (GksuContext *context, gboolean value);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1706
+
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1707
+gboolean
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1708
+gksu_context_get_elevated_role (GksuContext *context);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1709
+
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1710
+void
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1711
+gksu_context_set_privspec (GksuContext *context, gchar *privspec);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1712
+
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1713
+const gchar*
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1714
+gksu_context_get_privspec (GksuContext *context);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1715
+
9768
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1716
+gint
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1717
+gksu_context_get_num_msg (GksuContext *context);
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1718
+
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1719
+const gchar*
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1720
+gksu_context_get_pam_message (GksuContext *context, gint index);
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1721
+
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1722
+const gchar*
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1723
+gksu_context_get_pam_response (GksuContext *context, gint index);
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1724
+
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1725
+void
66289afec5f4 2007-04-22 Jim Li <[email protected]>
jim
parents: 9235
diff changeset
  1726
+gksu_context_set_pam_response (GksuContext *context, gint index, gchar *response);
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1727
+
14422
6bf888d69494 2008-10-07 Jim Li <[email protected]>
jim
parents: 11932
diff changeset
  1728
+gboolean
6bf888d69494 2008-10-07 Jim Li <[email protected]>
jim
parents: 11932
diff changeset
  1729
+gksu_context_get_pfexec_mode (GksuContext *context);
6bf888d69494 2008-10-07 Jim Li <[email protected]>
jim
parents: 11932
diff changeset
  1730
+
14430
969b5f184948 2008-10-09 Jim Li <[email protected]>
jim
parents: 14422
diff changeset
  1731
+void
969b5f184948 2008-10-09 Jim Li <[email protected]>
jim
parents: 14422
diff changeset
  1732
+gksu_context_set_need_pipe (GksuContext *context, gboolean value);
969b5f184948 2008-10-09 Jim Li <[email protected]>
jim
parents: 14422
diff changeset
  1733
+
969b5f184948 2008-10-09 Jim Li <[email protected]>
jim
parents: 14422
diff changeset
  1734
+gboolean
969b5f184948 2008-10-09 Jim Li <[email protected]>
jim
parents: 14422
diff changeset
  1735
+gksu_context_get_need_pipe (GksuContext *context);
969b5f184948 2008-10-09 Jim Li <[email protected]>
jim
parents: 14422
diff changeset
  1736
+
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1737
 G_END_DECLS
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1738
 
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1739
 #endif
14761
ada30a14249c 2008-12-12 Jim Li <[email protected]>
jim
parents: 14430
diff changeset
  1740
diff -ru libgksu1.2-1.3.1.orig/libgksu/test-gksu.c libgksu1.2-1.3.1/libgksu/test-gksu.c
ada30a14249c 2008-12-12 Jim Li <[email protected]>
jim
parents: 14430
diff changeset
  1741
--- libgksu1.2-1.3.1.orig/libgksu/test-gksu.c	2005-06-18 22:21:47.000000000 +0800
ada30a14249c 2008-12-12 Jim Li <[email protected]>
jim
parents: 14430
diff changeset
  1742
+++ libgksu1.2-1.3.1/libgksu/test-gksu.c	2008-12-12 14:18:30.105921000 +0800
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1743
@@ -21,7 +21,12 @@
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1744
 #include <stdlib.h>
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1745
 #include <string.h>
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1746
 #include <unistd.h>
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1747
-
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1748
+#include <sys/wait.h>
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1749
+#include <sys/types.h>
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1750
+#include <fcntl.h>
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1751
+#include <sys/ioctl.h>
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1752
+#include <sys/stream.h>
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1753
+#include <sys/stropts.h>
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1754
 #include "gksu.h"
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1755
 
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1756
 int
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1757
@@ -32,6 +37,9 @@
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1758
   char *password;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1759
   gboolean try_su = TRUE;
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1760
   gboolean try_sudo = TRUE;
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1761
+  int stdin_fd, stdout_fd;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1762
+  FILE *infile, *outfile;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1763
+  pid_t child_pid;
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1764
 
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1765
   if (argc > 1)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1766
     {
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1767
@@ -44,13 +52,25 @@
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1768
   context = gksu_context_new ();
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1769
 
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1770
   gksu_context_set_debug (context, TRUE);
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1771
-  gksu_context_set_command (context, "/usr/bin/X11/xterm");
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1772
+  gksu_context_set_elevated_privilege (context, FALSE);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1773
+  gksu_context_set_elevated_role (context, TRUE);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1774
+//  gksu_context_set_user (context, "lizhi");
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1775
+  gksu_context_set_wait_for_child_to_exit (context, FALSE);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1776
+//  gksu_context_set_command (context, "/usr/openwin/bin/xterm");
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1777
+  gksu_context_set_privspec (context, "All");
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1778
+  gksu_context_set_command (context, "/usr/bin/ids");
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1779
+  if ( gksu_context_get_wait_for_child_to_exit (context) ) {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1780
+    gksu_context_set_command (context, "/usr/bin/ids");
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1781
+  } else {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1782
+    gksu_context_set_command (context, "/usr/bin/ids --nowait");
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1783
+  }
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1784
 
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1785
   if (try_su)
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1786
     {
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1787
+      error = NULL;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1788
       if (gksu_context_try_need_password (context))
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1789
 	{
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1790
-	  password = getpass ("Type the root password: ");
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1791
+	  password = getpass ( g_strdup_printf ("Type the %s password: ", context->user) );
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1792
 	  gksu_context_set_password (context, password);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1793
 	}
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1794
       
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1795
@@ -58,6 +78,47 @@
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1796
       gksu_context_run (context, &error);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1797
       if (error)
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1798
 	fprintf (stderr, "gksu_run failed: %s\n", error->message);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1799
+      child_pid = gksu_context_get_child_pid (context);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1800
+      printf ("child pid is %d\n", child_pid );
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1801
+      stdin_fd = gksu_context_get_child_stdin_fd (context);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1802
+      stdout_fd = gksu_context_get_child_stdout_fd (context);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1803
+      fprintf (stderr, "stdin_fd = %d, stdout_fd = %d\n", stdin_fd, stdout_fd);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1804
+      infile = gksu_context_get_child_stdin_file (context);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1805
+      if (!infile)
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1806
+	fprintf (stderr, "fdopen infile error!\n");
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1807
+      outfile = gksu_context_get_child_stdout_file (context);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1808
+      if (!outfile)
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1809
+	fprintf (stderr, "fdopen outfile error!\n");
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1810
+      int aa, status;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1811
+      char buffer [256];
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1812
+      
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1813
+      if ( gksu_context_get_wait_for_child_to_exit (context) ) {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1814
+	fprintf (outfile, "quit\n");
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1815
+	fflush (outfile);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1816
+      } else {	
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1817
+      for (int i=0;i<5;i++) {
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1818
+	bzero (buffer, 256);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1819
+	  fprintf (stderr, "step 1\n");
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1820
+	if (!fgets (buffer, 255, infile))
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1821
+		break;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1822
+	fprintf (stderr, "initial input %d = %s", i+1, buffer);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1823
+      }
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1824
+      while (!waitpid (child_pid, &status, WNOHANG))
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1825
+	{
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1826
+	  bzero (buffer, 256);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1827
+	  fgets (buffer, 255, stdin);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1828
+	  fprintf (outfile,"%s",  buffer);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1829
+	  fflush (outfile);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1830
+	
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1831
+	  bzero(buffer, 256);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1832
+	  fgets (buffer, 255, infile);
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1833
+	
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1834
+	  if( strncmp (buffer, "quit", strlen("quit") ) == 0)
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1835
+	    break;
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1836
+	  fprintf (stderr, "echo = %s", buffer);
7853
833e08919db2 * gksu.spec: Create new spec file for gksu
zl156116
parents:
diff changeset
  1837
+	}
8393
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1838
+      }
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1839
+	
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1840
     }
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1841
   
96b43c2324f8 2006-10-21 Jim Li <[email protected]>
jim
parents: 8225
diff changeset
  1842
   if (try_sudo)