]> git.pld-linux.org Git - packages/coreutils.git/blob - coreutils-runuser.patch
- try not to use "du", but this code is very experimental (works on Linux though...
[packages/coreutils.git] / coreutils-runuser.patch
1 --- coreutils-6.10/README.orig  2008-01-18 09:26:09.000000000 +0100
2 +++ coreutils-6.10/README       2008-03-02 14:24:55.578407708 +0100
3 @@ -12,7 +12,7 @@
4    factor false fmt fold groups head hostid hostname id install join kill
5    link ln logname ls md5sum mkdir mkfifo mknod mktemp mv nice nl nohup
6    nproc od paste pathchk pinky pr printenv printf ptx pwd readlink rm rmdir
7 -  runcon seq sha1sum sha224sum sha256sum sha384sum sha512sum shred shuf
8 +  runcon runuser seq sha1sum sha224sum sha256sum sha384sum sha512sum shred shuf
9    sleep sort split stat stdbuf stty su sum sync tac tail tee test timeout
10    touch tr true truncate tsort tty uname unexpand uniq unlink uptime users
11    vdir wc who whoami yes
12 --- coreutils-6.10/AUTHORS.orig 2008-01-05 23:58:24.000000000 +0100
13 +++ coreutils-6.10/AUTHORS      2008-03-02 14:25:23.908022120 +0100
14 @@ -64,6 +64,7 @@
15  rm: Paul Rubin, David MacKenzie, Richard Stallman, Jim Meyering
16  rmdir: David MacKenzie
17  runcon: Russell Coker
18 +runuser: David MacKenzie, Dan Walsh
19  seq: Ulrich Drepper
20  sha1sum: Ulrich Drepper, Scott Miller, David Madore
21  sha224sum: Ulrich Drepper, Scott Miller, David Madore
22 --- coreutils-6.7/src/su.c.runuser      2007-01-09 17:27:56.000000000 +0000
23 +++ coreutils-6.7/src/su.c      2007-01-09 17:30:12.000000000 +0000
24 @@ -109,9 +109,15 @@
25  #include "error.h"
26  
27  /* The official name of this program (e.g., no `g' prefix).  */
28 +#ifndef RUNUSER
29  #define PROGRAM_NAME "su"
30 +#else
31 +#define PROGRAM_NAME "runuser"
32 +#endif
33  
34 +#ifndef AUTHORS
35  #define AUTHORS proper_name ("David MacKenzie")
36 +#endif
37  
38  #if HAVE_PATHS_H
39  # include <paths.h>
40 @@ -149,6 +149,10 @@
41  char *crypt (char const *key, char const *salt);
42  #endif
43  
44 +#ifndef CHECKPASSWD
45 +#define CHECKPASSWD 1
46 +#endif
47 +
48  static void run_shell (char const *, char const *, char **, size_t,
49                 const struct passwd *)
50  #ifdef USE_PAM
51 @@ -154,7 +154,11 @@
52  #endif
53  
54  static void run_shell (char const *, char const *, char **, size_t,
55 -               const struct passwd *)
56 +               const struct passwd *
57 +#ifdef RUNUSER
58 +               , gid_t *groups, int num_groups
59 +#endif
60 +               )
61  #ifdef USE_PAM
62         ;
63  #else
64 @@ -187,6 +201,10 @@
65    {"login", no_argument, NULL, 'l'},
66    {"preserve-environment", no_argument, NULL, 'p'},
67    {"shell", required_argument, NULL, 's'},
68 +#ifdef RUNUSER
69 +  {"group", required_argument, NULL, 'g'},
70 +  {"supp-group", required_argument, NULL, 'G'},
71 +#endif
72    {GETOPT_HELP_OPTION_DECL},
73    {GETOPT_VERSION_OPTION_DECL},
74    {NULL, 0, NULL, 0}
75 @@ -288,10 +306,12 @@
76    retval = pam_start(PROGRAM_NAME, pw->pw_name, &conv, &pamh);
77    PAM_BAIL_P;
78  
79 +#ifndef RUNUSER
80    if (getuid() != 0 && !isatty(0)) {
81         fprintf(stderr, _("standard in must be a tty\n"));
82         exit(1);
83    }
84 +#endif
85  
86    caller = getpwuid(getuid());
87    if(caller != NULL && caller->pw_name != NULL) {
88 @@ -308,6 +328,11 @@
89      retval = pam_set_item(pamh, PAM_TTY, tty_name);
90      PAM_BAIL_P;
91    }
92 +#ifdef RUNUSER
93 +  if (getuid() != geteuid())
94 +    /* safety net: deny operation if we are suid by accident */
95 +    error(EXIT_FAILURE, 1, "runuser may not be setuid");
96 +#else
97    retval = pam_authenticate(pamh, 0);
98    PAM_BAIL_P;
99    retval = pam_acct_mgmt(pamh, 0);
100 @@ -317,6 +342,7 @@
101      PAM_BAIL_P;
102    }
103    PAM_BAIL_P;
104 +#endif
105    /* must be authenticated if this point was reached */
106    return 1;
107  #else /* !USE_PAM */
108 @@ -398,11 +424,22 @@
109  /* Become the user and group(s) specified by PW.  */
110  
111  static void
112 -change_identity (const struct passwd *pw)
113 +change_identity (const struct passwd *pw
114 +#ifdef RUNUSER
115 +                , gid_t *groups, int num_groups
116 +#endif
117 +       )
118  {
119  #ifdef HAVE_INITGROUPS
120 +  int rc = 0;
121    errno = 0;
122 -  if (initgroups (pw->pw_name, pw->pw_gid) == -1) {
123 +#ifdef RUNUSER
124 +  if (num_groups)
125 +    rc = setgroups(num_groups, groups);
126 +  else
127 +#endif
128 +    rc = initgroups(pw->pw_name, pw->pw_gid);
129 +  if (rc == -1) {
130  #ifdef USE_PAM
131      pam_close_session(pamh, 0);
132      pam_end(pamh, PAM_ABORT);
133 @@ -449,7 +486,11 @@
134  
135  static void
136  run_shell (char const *shell, char const *command, char **additional_args,
137 -           size_t n_additional_args, const struct passwd *pw)
138 +           size_t n_additional_args, const struct passwd *pw
139 +#ifdef RUNUSER
140 +           , gid_t *groups, int num_groups
141 +#endif
142 +  )
143  {
144    size_t n_args = 1 + fast_startup + 2 * !!command + n_additional_args + 1;
145    char const **args = xnmalloc (n_args, sizeof *args);
146 @@ -480,7 +521,11 @@
147  
148    child = fork();
149    if (child == 0) {  /* child shell */
150 -  change_identity (pw);
151 +  change_identity (pw
152 +#ifdef RUNUSER
153 +                  , groups, num_groups
154 +#endif
155 +         );
156    pam_end(pamh, 0);
157    if (!same_session)
158      setsid ();
159 @@ -657,6 +702,12 @@
160    char *shell = NULL;
161    struct passwd *pw;
162    struct passwd pw_copy;
163 +#ifdef RUNUSER
164 +  struct group *gr;
165 +  gid_t groups[NGROUPS_MAX];
166 +  int num_supp_groups = 0;
167 +  int use_gid = 0;
168 +#endif
169  
170    initialize_main (&argc, &argv);
171    program_name = argv[0];
172 @@ -671,7 +722,11 @@
173    simulate_login = false;
174    change_environment = true;
175  
176 -  while ((optc = getopt_long (argc, argv, "c:flmps:", longopts, NULL)) != -1)
177 +  while ((optc = getopt_long (argc, argv, "c:flmps:"
178 +#ifdef RUNUSER
179 +                             "g:G:"
180 +#endif
181 +                             , longopts, NULL)) != -1)
182      {
183        switch (optc)
184         {
185 @@ -701,6 +756,28 @@
186            shell = optarg;
187            break;
188  
189 +#ifdef RUNUSER
190 +       case 'g':
191 +         gr = getgrnam(optarg);
192 +         if (!gr)
193 +           error (EXIT_FAILURE, 0, _("group %s does not exist"), optarg);
194 +         use_gid = 1;
195 +         groups[0] = gr->gr_gid;
196 +         break;
197 +
198 +       case 'G':
199 +         num_supp_groups++;
200 +         if (num_supp_groups >= NGROUPS_MAX)
201 +           error (EXIT_FAILURE, 0,
202 +                  _("Can't specify more than %d supplemental groups"),
203 +                  NGROUPS_MAX - 1);
204 +         gr = getgrnam(optarg);
205 +         if (!gr)
206 +           error (EXIT_FAILURE, 0, _("group %s does not exist"), optarg);
207 +         groups[num_supp_groups] = gr->gr_gid;
208 +         break;
209 +#endif
210 +
211          case_GETOPT_HELP_CHAR;
212  
213          case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
214 @@ -739,7 +816,20 @@
215                            : DEFAULT_SHELL);
216    endpwent ();
217  
218 -  if (!correct_password (pw))
219 +#ifdef RUNUSER
220 +  if (num_supp_groups && !use_gid)
221 +  {
222 +    pw->pw_gid = groups[1];
223 +    memmove (groups, groups + 1, sizeof(gid_t) * num_supp_groups);
224 +  }
225 +  else if (use_gid)
226 +  {
227 +    pw->pw_gid = groups[0];
228 +    num_supp_groups++;
229 +  }
230 +#endif
231 +
232 +  if (CHECKPASSWD && !correct_password (pw))
233      {
234  #ifdef SYSLOG_FAILURE
235        log_su (pw, false);
236 @@ -814,7 +814,11 @@
237    modify_environment (pw, shell);
238  
239  #ifndef USE_PAM
240 -  change_identity (pw);
241 +  change_identity (pw
242 +#ifdef RUNUSER
243 +                 , groups, num_supp_groups
244 +#endif
245 +                 );
246  #endif
247  
248    /* error() flushes stderr, but does not check for write failure.
249 @@ -825,5 +829,9 @@
250    if (ferror (stderr))
251      exit (EXIT_CANCELED);
252  
253 -  run_shell (shell, command, argv + optind, MAX (0, argc - optind), pw);
254 +  run_shell (shell, command, argv + optind, MAX (0, argc - optind), pw
255 +#ifdef RUNUSER
256 +                 , groups, num_supp_groups
257 +#endif
258 +                 );
259  }
260 --- coreutils-6.10/src/Makefile.am.orig 2008-03-02 14:22:53.223435095 +0100
261 +++ coreutils-6.10/src/Makefile.am      2008-03-02 14:25:58.317983032 +0100
262 @@ -101,6 +101,7 @@
263    rm           \
264    rmdir                \
265    runcon       \
266 +  runuser      \
267    seq          \
268    sha1sum      \
269    sha224sum    \
270 @@ -135,6 +135,10 @@
271  
272  stat_LDADD = $(LDADD) $(LIB_SELINUX)
273  
274 +runuser_SOURCES = su.c
275 +runuser_CFLAGS = -DRUNUSER -DAUTHORS="\"David MacKenzie, Dan Walsh\""
276 +runuser_LDADD = $(LDADD) $(LIB_CRYPT) $(LIB_PAM)
277 +
278  $(PROGRAMS): ../lib/libcoreutils.a
279  
280  # Get the release year from ../lib/version-etc.c.
281 @@ -156,7 +160,7 @@
282         chmod +x $@-t
283         mv $@-t $@
284  
285 -all-local: su$(EXEEXT)
286 +all-local: su$(EXEEXT) runuser$(EXEEXT)
287  
288  installed_su = $(DESTDIR)$(bindir)/`echo su|sed '$(transform)'`
289  
290 --- coreutils-6.10/man/Makefile.am.orig 2008-03-02 14:22:53.175432360 +0100
291 +++ coreutils-6.10/man/Makefile.am      2008-03-02 14:26:36.980186266 +0100
292 @@ -94,6 +94,7 @@
293  rm.1:          $(common_dep)   $(srcdir)/rm.x          ../src/rm.c
294  rmdir.1:       $(common_dep)   $(srcdir)/rmdir.x       ../src/rmdir.c
295  runcon.1:      $(common_dep)   $(srcdir)/runcon.x      ../src/runcon.c
296 +runuser.1:     $(common_dep)   $(srcdir)/runuser.x     ../src/su.c
297  seq.1:         $(common_dep)   $(srcdir)/seq.x         ../src/seq.c
298  sha1sum.1:     $(common_dep)   $(srcdir)/sha1sum.x     ../src/md5sum.c
299  sha224sum.1:   $(common_dep)   $(srcdir)/sha224sum.x   ../src/md5sum.c
300 --- /dev/null   2007-01-09 09:38:07.860075128 +0000
301 +++ coreutils-6.7/man/runuser.x 2007-01-09 17:27:56.000000000 +0000
302 @@ -0,0 +1,4 @@
303 +[NAME]
304 +runuser \- run a shell with substitute user and group IDs
305 +[DESCRIPTION]
306 +.\" Add any additional description here
307 --- /dev/null   2007-01-09 09:38:07.860075128 +0000
308 +++ coreutils-6.7/man/runuser.1 2007-01-09 17:27:56.000000000 +0000
309 @@ -0,0 +1,68 @@
310 +.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.33.
311 +.TH RUNUSER "1" "September 2004" "runuser (coreutils) 5.2.1" "User Commands"
312 +.SH NAME
313 +runuser \- run a shell with substitute user and group IDs, similar to su, but will not run PAM hooks
314 +.SH SYNOPSIS
315 +.B runuser
316 +[\fIOPTION\fR]... [\fI-\fR] [\fIUSER \fR[\fIARG\fR]...]
317 +.SH DESCRIPTION
318 +.\" Add any additional description here
319 +.PP
320 +Change the effective user id and group id to that of USER.  No PAM hooks
321 +are run, and there will be no password prompt.  This command is useful
322 +when run as the root user.  If run as a non-root user without privilege
323 +to set user ID, the command will fail.
324 +.TP
325 +-, \fB\-l\fR, \fB\-\-login\fR
326 +make the shell a login shell
327 +.TP
328 +\fB\-c\fR, \fB\-\-commmand\fR=\fICOMMAND\fR
329 +pass a single COMMAND to the shell with \fB\-c\fR
330 +.TP
331 +\fB\-f\fR, \fB\-\-fast\fR
332 +pass \fB\-f\fR to the shell (for csh or tcsh)
333 +.TP
334 +\fB\-g\fR, \fB\-\-group\fR=\fIGROUP\fR
335 +specify the primary group
336 +.TP
337 +\fB\-G\fR, \fB\-\-supp-group\fR=\fIGROUP\fR
338 +specify a supplemental group
339 +.TP
340 +\fB\-m\fR, \fB\-\-preserve\-environment\fR
341 +do not reset environment variables
342 +.TP
343 +\fB\-p\fR
344 +same as \fB\-m\fR
345 +.TP
346 +\fB\-s\fR, \fB\-\-shell\fR=\fISHELL\fR
347 +run SHELL if /etc/shells allows it
348 +.TP
349 +\fB\-\-help\fR
350 +display this help and exit
351 +.TP
352 +\fB\-\-version\fR
353 +output version information and exit
354 +.PP
355 +A mere - implies \fB\-l\fR.   If USER not given, assume root.
356 +.SH AUTHOR
357 +Written by David MacKenzie, Dan Walsh.
358 +.SH "REPORTING BUGS"
359 +Report bugs to <bug-coreutils@gnu.org>.
360 +.SH COPYRIGHT
361 +Copyright \(co 2004 Free Software Foundation, Inc.
362 +.br
363 +This is free software; see the source for copying conditions.  There is NO
364 +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
365 +.SH "SEE ALSO"
366 +Since this command is trimmed down version of su use you can use the su manual.
367 +The full documentation for
368 +.B su
369 +is maintained as a Texinfo manual.  If the
370 +.B info
371 +and
372 +.B su
373 +programs are properly installed at your site, the command
374 +.IP
375 +.B info coreutils su
376 +.PP
377 +should give you access to the complete manual.
378 --- coreutils-6.10/po/pl.po.orig        2008-03-02 14:22:54.123486386 +0100
379 +++ coreutils-6.10/po/pl.po     2008-03-02 14:28:35.858960780 +0100
380 @@ -8986,6 +8986,16 @@
381  msgid "warning: cannot change directory to %s"
382  msgstr "uwaga: nie można zmienić katalogu na %s"
383  
384 +#: src/su.c:runuser
385 +#, c-format
386 +msgid "group %s does not exist"
387 +msgstr "grupa %s nie istnieje"
388 +
389 +#: src/su.c:runuser
390 +#, c-format
391 +msgid "Can't specify more than %d supplemental groups"
392 +msgstr "Nie można określić więcej niż %d grup dodatkowych"
393 +
394  #. This is a proper name. See the gettext manual, section Names.
395  #: src/sum.c:36
396  msgid "Kayvan Aghaiepour"
This page took 1.305538 seconds and 3 git commands to generate.