Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 503 lines (448 sloc) 13.448 kb
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
1 /* vi: set sw=4 ts=4: */
801ab14 Add one-line GPL boilerplate to numerous (but not all yet) source files.
"Robert P. J. Day" authored
2 /*
3 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
4 */
5
b6adbf1 usage.c: remove reference to busybox.h
Denis Vlasenko authored
6 #include "libbb.h"
f470196 @aldot - fix conflicting decls of syslog related facilitynames and priorityn…
aldot authored
7 #include <syslog.h>
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
8 #include <utmp.h>
9 #include <sys/resource.h>
10
c0415a9 login: nuke nonblock() - we have it in libbb; -400 bytes bss.
Denis Vlasenko authored
11 #if ENABLE_SELINUX
60158cb @landley A patch from Takeharu KATO to update/fix SE-Linux support.
landley authored
12 #include <selinux/selinux.h> /* for is_selinux_enabled() */
13 #include <selinux/get_context_list.h> /* for get_default_context() */
14 #include <selinux/flask.h> /* for security class definitions */
9e48045 Patch from Russell Coker:
Eric Andersen authored
15 #endif
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
16
d6e81c7 login: optional support for PAM
Denis Vlasenko authored
17 #if ENABLE_PAM
c6c2345 login: fixes for PAM build
Denis Vlasenko authored
18 /* PAM may include <locale.h>. We may need to undefine bbox's stub define: */
19 #undef setlocale
20 /* For some obscure reason, PAM is not in pam/xxx, but in security/xxx.
21 * Apparently they like to confuse people. */
22 #include <security/pam_appl.h>
23 #include <security/pam_misc.h>
d6e81c7 login: optional support for PAM
Denis Vlasenko authored
24 static const struct pam_conv conv = {
25 misc_conv,
26 NULL
27 };
28 #endif
29
942e429 login: previous commit comment was wrong :)
Denis Vlasenko authored
30 enum {
31 TIMEOUT = 60,
32 EMPTY_USERNAME_COUNT = 10,
33 USERNAME_SIZE = 32,
9a9edf2 login: make it saner and smaller by ~0.5k.
Denis Vlasenko authored
34 TTYNAME_SIZE = 32,
942e429 login: previous commit comment was wrong :)
Denis Vlasenko authored
35 };
0fbff13 Several login cleanups from vodz
Eric Andersen authored
36
c0415a9 login: nuke nonblock() - we have it in libbb; -400 bytes bss.
Denis Vlasenko authored
37 static char* short_tty;
7ccf5cc login: eliminate forward decls and #ifdefs
Denis Vlasenko authored
38
39 #if ENABLE_FEATURE_UTMP
40 /* vv Taken from tinylogin utmp.c vv */
41 /*
42 * read_or_build_utent - see if utmp file is correct for this process
43 *
44 * System V is very picky about the contents of the utmp file
45 * and requires that a slot for the current process exist.
46 * The utmp file is scanned for an entry with the same process
47 * ID. If no entry exists the process exits with a message.
48 *
49 * The "picky" flag is for network and other logins that may
50 * use special flags. It allows the pid checks to be overridden.
51 * This means that getty should never invoke login with any
52 * command line flags.
53 */
66fabdb login: apply fixes + getopt_ulflag'ification by Bernhard
Denis Vlasenko authored
54
c0415a9 login: nuke nonblock() - we have it in libbb; -400 bytes bss.
Denis Vlasenko authored
55 static void read_or_build_utent(struct utmp *utptr, int picky)
7ccf5cc login: eliminate forward decls and #ifdefs
Denis Vlasenko authored
56 {
57 struct utmp *ut;
58 pid_t pid = getpid();
59
60 setutent();
61
62 /* First, try to find a valid utmp entry for this process. */
63 while ((ut = getutent()))
64 if (ut->ut_pid == pid && ut->ut_line[0] && ut->ut_id[0] &&
65 (ut->ut_type == LOGIN_PROCESS || ut->ut_type == USER_PROCESS))
66 break;
67
68 /* If there is one, just use it, otherwise create a new one. */
69 if (ut) {
c0415a9 login: nuke nonblock() - we have it in libbb; -400 bytes bss.
Denis Vlasenko authored
70 *utptr = *ut;
7ccf5cc login: eliminate forward decls and #ifdefs
Denis Vlasenko authored
71 } else {
72 if (picky)
73 bb_error_msg_and_die("no utmp entry found");
74
c0415a9 login: nuke nonblock() - we have it in libbb; -400 bytes bss.
Denis Vlasenko authored
75 memset(utptr, 0, sizeof(*utptr));
76 utptr->ut_type = LOGIN_PROCESS;
77 utptr->ut_pid = pid;
78 strncpy(utptr->ut_line, short_tty, sizeof(utptr->ut_line));
7ccf5cc login: eliminate forward decls and #ifdefs
Denis Vlasenko authored
79 /* This one is only 4 chars wide. Try to fit something
80 * remotely meaningful by skipping "tty"... */
c0415a9 login: nuke nonblock() - we have it in libbb; -400 bytes bss.
Denis Vlasenko authored
81 strncpy(utptr->ut_id, short_tty + 3, sizeof(utptr->ut_id));
82 strncpy(utptr->ut_user, "LOGIN", sizeof(utptr->ut_user));
83 utptr->ut_time = time(NULL);
7ccf5cc login: eliminate forward decls and #ifdefs
Denis Vlasenko authored
84 }
85 if (!picky) /* root login */
c0415a9 login: nuke nonblock() - we have it in libbb; -400 bytes bss.
Denis Vlasenko authored
86 memset(utptr->ut_host, 0, sizeof(utptr->ut_host));
7ccf5cc login: eliminate forward decls and #ifdefs
Denis Vlasenko authored
87 }
88
89 /*
90 * write_utent - put a USER_PROCESS entry in the utmp file
91 *
92 * write_utent changes the type of the current utmp entry to
93 * USER_PROCESS. the wtmp file will be updated as well.
94 */
c0415a9 login: nuke nonblock() - we have it in libbb; -400 bytes bss.
Denis Vlasenko authored
95 static void write_utent(struct utmp *utptr, const char *username)
7ccf5cc login: eliminate forward decls and #ifdefs
Denis Vlasenko authored
96 {
c0415a9 login: nuke nonblock() - we have it in libbb; -400 bytes bss.
Denis Vlasenko authored
97 utptr->ut_type = USER_PROCESS;
98 strncpy(utptr->ut_user, username, sizeof(utptr->ut_user));
99 utptr->ut_time = time(NULL);
7ccf5cc login: eliminate forward decls and #ifdefs
Denis Vlasenko authored
100 /* other fields already filled in by read_or_build_utent above */
101 setutent();
c0415a9 login: nuke nonblock() - we have it in libbb; -400 bytes bss.
Denis Vlasenko authored
102 pututline(utptr);
7ccf5cc login: eliminate forward decls and #ifdefs
Denis Vlasenko authored
103 endutent();
104 #if ENABLE_FEATURE_WTMP
105 if (access(bb_path_wtmp_file, R_OK|W_OK) == -1) {
106 close(creat(bb_path_wtmp_file, 0664));
107 }
c0415a9 login: nuke nonblock() - we have it in libbb; -400 bytes bss.
Denis Vlasenko authored
108 updwtmp(bb_path_wtmp_file, utptr);
7ccf5cc login: eliminate forward decls and #ifdefs
Denis Vlasenko authored
109 #endif
110 }
66fabdb login: apply fixes + getopt_ulflag'ification by Bernhard
Denis Vlasenko authored
111 #else /* !ENABLE_FEATURE_UTMP */
c0415a9 login: nuke nonblock() - we have it in libbb; -400 bytes bss.
Denis Vlasenko authored
112 #define read_or_build_utent(utptr, picky) ((void)0)
113 #define write_utent(utptr, username) ((void)0)
66fabdb login: apply fixes + getopt_ulflag'ification by Bernhard
Denis Vlasenko authored
114 #endif /* !ENABLE_FEATURE_UTMP */
7ccf5cc login: eliminate forward decls and #ifdefs
Denis Vlasenko authored
115
f312e32 login: make /etc/nologin support configurable. -240 bytes if not sele…
Denis Vlasenko authored
116 #if ENABLE_FEATURE_NOLOGIN
68404f1 *: add -Wunused-parameter; fix resulting breakage
Denis Vlasenko authored
117 static void die_if_nologin(void)
7ccf5cc login: eliminate forward decls and #ifdefs
Denis Vlasenko authored
118 {
119 FILE *fp;
120 int c;
121
f312e32 login: make /etc/nologin support configurable. -240 bytes if not sele…
Denis Vlasenko authored
122 if (access("/etc/nologin", F_OK))
7ccf5cc login: eliminate forward decls and #ifdefs
Denis Vlasenko authored
123 return;
124
f312e32 login: make /etc/nologin support configurable. -240 bytes if not sele…
Denis Vlasenko authored
125 fp = fopen("/etc/nologin", "r");
7ccf5cc login: eliminate forward decls and #ifdefs
Denis Vlasenko authored
126 if (fp) {
127 while ((c = getc(fp)) != EOF)
4daad90 introduce bb_putchar(). saves ~1800 on uclibc (less on glibc).
Denis Vlasenko authored
128 bb_putchar((c=='\n') ? '\r' : c);
7ccf5cc login: eliminate forward decls and #ifdefs
Denis Vlasenko authored
129 fflush(stdout);
130 fclose(fp);
131 } else
132 puts("\r\nSystem closed for routine maintenance\r");
85c2471 *: fix fallout from -Wunused-parameter
Denis Vlasenko authored
133 exit(1);
7ccf5cc login: eliminate forward decls and #ifdefs
Denis Vlasenko authored
134 }
f312e32 login: make /etc/nologin support configurable. -240 bytes if not sele…
Denis Vlasenko authored
135 #else
68404f1 *: add -Wunused-parameter; fix resulting breakage
Denis Vlasenko authored
136 static ALWAYS_INLINE void die_if_nologin(void) {}
f312e32 login: make /etc/nologin support configurable. -240 bytes if not sele…
Denis Vlasenko authored
137 #endif
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
138
d6e81c7 login: optional support for PAM
Denis Vlasenko authored
139 #if ENABLE_FEATURE_SECURETTY && !ENABLE_PAM
7ccf5cc login: eliminate forward decls and #ifdefs
Denis Vlasenko authored
140 static int check_securetty(void)
141 {
142 FILE *fp;
143 int i;
f312e32 login: make /etc/nologin support configurable. -240 bytes if not sele…
Denis Vlasenko authored
144 char buf[256];
7ccf5cc login: eliminate forward decls and #ifdefs
Denis Vlasenko authored
145
f312e32 login: make /etc/nologin support configurable. -240 bytes if not sele…
Denis Vlasenko authored
146 fp = fopen("/etc/securetty", "r");
7ccf5cc login: eliminate forward decls and #ifdefs
Denis Vlasenko authored
147 if (!fp) {
148 /* A missing securetty file is not an error. */
149 return 1;
150 }
151 while (fgets(buf, sizeof(buf)-1, fp)) {
f312e32 login: make /etc/nologin support configurable. -240 bytes if not sele…
Denis Vlasenko authored
152 for (i = strlen(buf)-1; i >= 0; --i) {
7ccf5cc login: eliminate forward decls and #ifdefs
Denis Vlasenko authored
153 if (!isspace(buf[i]))
154 break;
155 }
156 buf[++i] = '\0';
f312e32 login: make /etc/nologin support configurable. -240 bytes if not sele…
Denis Vlasenko authored
157 if (!buf[0] || (buf[0] == '#'))
7ccf5cc login: eliminate forward decls and #ifdefs
Denis Vlasenko authored
158 continue;
159 if (strcmp(buf, short_tty) == 0) {
160 fclose(fp);
161 return 1;
162 }
163 }
164 fclose(fp);
165 return 0;
166 }
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
167 #else
f312e32 login: make /etc/nologin support configurable. -240 bytes if not sele…
Denis Vlasenko authored
168 static ALWAYS_INLINE int check_securetty(void) { return 1; }
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
169 #endif
170
7ccf5cc login: eliminate forward decls and #ifdefs
Denis Vlasenko authored
171 static void get_username_or_die(char *buf, int size_buf)
172 {
173 int c, cntdown;
d8540f7 init: make sure fd 0,1,2 are not closed, + related optimizations.
Denis Vlasenko authored
174
7ccf5cc login: eliminate forward decls and #ifdefs
Denis Vlasenko authored
175 cntdown = EMPTY_USERNAME_COUNT;
d8540f7 init: make sure fd 0,1,2 are not closed, + related optimizations.
Denis Vlasenko authored
176 prompt:
7ccf5cc login: eliminate forward decls and #ifdefs
Denis Vlasenko authored
177 print_login_prompt();
d8540f7 init: make sure fd 0,1,2 are not closed, + related optimizations.
Denis Vlasenko authored
178 /* skip whitespace */
7ccf5cc login: eliminate forward decls and #ifdefs
Denis Vlasenko authored
179 do {
180 c = getchar();
181 if (c == EOF) exit(1);
182 if (c == '\n') {
183 if (!--cntdown) exit(1);
184 goto prompt;
185 }
186 } while (isspace(c));
187
188 *buf++ = c;
189 if (!fgets(buf, size_buf-2, stdin))
190 exit(1);
191 if (!strchr(buf, '\n'))
192 exit(1);
193 while (isgraph(*buf)) buf++;
194 *buf = '\0';
195 }
196
197 static void motd(void)
198 {
0de3c55 login: remove setpgrp call (makes it work from shell prompt again).
Denis Vlasenko authored
199 int fd;
7ccf5cc login: eliminate forward decls and #ifdefs
Denis Vlasenko authored
200
0de3c55 login: remove setpgrp call (makes it work from shell prompt again).
Denis Vlasenko authored
201 fd = open(bb_path_motd_file, O_RDONLY);
5281630 login: clear dangerous environment variables if started by non-root
Denis Vlasenko authored
202 if (fd >= 0) {
0de3c55 login: remove setpgrp call (makes it work from shell prompt again).
Denis Vlasenko authored
203 fflush(stdout);
204 bb_copyfd_eof(fd, STDOUT_FILENO);
205 close(fd);
7ccf5cc login: eliminate forward decls and #ifdefs
Denis Vlasenko authored
206 }
207 }
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
208
942e429 login: previous commit comment was wrong :)
Denis Vlasenko authored
209 static void alarm_handler(int sig ATTRIBUTE_UNUSED)
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
210 {
2f50aa4 login: use some ideas from util-linux's login.
Denis Vlasenko authored
211 /* This is the escape hatch! Poor serial line users and the like
212 * arrive here when their connection is broken.
213 * We don't want to block here */
c0415a9 login: nuke nonblock() - we have it in libbb; -400 bytes bss.
Denis Vlasenko authored
214 ndelay_on(1);
0de3c55 login: remove setpgrp call (makes it work from shell prompt again).
Denis Vlasenko authored
215 printf("\r\nLogin timed out after %d seconds\r\n", TIMEOUT);
400d8bb less,klogd,syslogd,nc,tcpudp: exit on signal by killing itself, not e…
Denis Vlasenko authored
216 fflush(stdout);
5281630 login: clear dangerous environment variables if started by non-root
Denis Vlasenko authored
217 /* unix API is brain damaged regarding O_NONBLOCK,
218 * we should undo it, or else we can affect other processes */
219 ndelay_off(1);
400d8bb less,klogd,syslogd,nc,tcpudp: exit on signal by killing itself, not e…
Denis Vlasenko authored
220 _exit(EXIT_SUCCESS);
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
221 }
222
9b49a5e add -fvisibility=hidden to CC flags, mark XXX_main functions
Denis Vlasenko authored
223 int login_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
1d42665 *: shrink: use Vladimir's "o+" specifier instead of xatou(opt_param)
Denis Vlasenko authored
224 int login_main(int argc ATTRIBUTE_UNUSED, char **argv)
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
225 {
66fabdb login: apply fixes + getopt_ulflag'ification by Bernhard
Denis Vlasenko authored
226 enum {
227 LOGIN_OPT_f = (1<<0),
228 LOGIN_OPT_h = (1<<1),
229 LOGIN_OPT_p = (1<<2),
230 };
d6e81c7 login: optional support for PAM
Denis Vlasenko authored
231 char *fromhost;
0fbff13 Several login cleanups from vodz
Eric Andersen authored
232 char username[USERNAME_SIZE];
dc4e75e move all "-/bin/sh" "/bin/sh" and "sh" to libbb/messages.c file as one
Glenn L McGrath authored
233 const char *tmp;
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
234 int amroot;
67b23e6 getopt_ulflags -> getopt32.
Denis Vlasenko authored
235 unsigned opt;
942e429 login: previous commit comment was wrong :)
Denis Vlasenko authored
236 int count = 0;
9a9edf2 login: make it saner and smaller by ~0.5k.
Denis Vlasenko authored
237 struct passwd *pw;
cdf6277 dos2unix: tiny shrink
Denis Vlasenko authored
238 char *opt_host = opt_host; /* for compiler */
239 char *opt_user = opt_user; /* for compiler */
c0415a9 login: nuke nonblock() - we have it in libbb; -400 bytes bss.
Denis Vlasenko authored
240 char full_tty[TTYNAME_SIZE];
66fabdb login: apply fixes + getopt_ulflag'ification by Bernhard
Denis Vlasenko authored
241 USE_SELINUX(security_context_t user_sid = NULL;)
c0415a9 login: nuke nonblock() - we have it in libbb; -400 bytes bss.
Denis Vlasenko authored
242 USE_FEATURE_UTMP(struct utmp utent;)
a29a5e4 login: fix PAM login (was unable to complete Kerberos login)
Denis Vlasenko authored
243 #if ENABLE_PAM
244 int pamret;
245 pam_handle_t *pamh;
246 const char *pamuser;
247 const char *failed_msg;
248 struct passwd pwdstruct;
249 char pwdbuf[256];
250 #endif
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
251
c0415a9 login: nuke nonblock() - we have it in libbb; -400 bytes bss.
Denis Vlasenko authored
252 short_tty = full_tty;
942e429 login: previous commit comment was wrong :)
Denis Vlasenko authored
253 username[0] = '\0';
254 signal(SIGALRM, alarm_handler);
255 alarm(TIMEOUT);
c7bda1c Remove trailing whitespace. Update copyright to include 2004.
Eric Andersen authored
256
c9ca0a3 mount: recognize "dirsync" (closes bug 835)
Denis Vlasenko authored
257 /* More of suid paranoia if called by non-root */
258 amroot = !sanitize_env_if_suid(); /* Clear dangerous stuff, set PATH */
259
0de3c55 login: remove setpgrp call (makes it work from shell prompt again).
Denis Vlasenko authored
260 /* Mandatory paranoia for suid applet:
261 * ensure that fd# 0,1,2 are opened (at least to /dev/null)
262 * and any extra open fd's are closed.
263 * (The name of the function is misleading. Not daemonizing here.) */
264 bb_daemonize_or_rexec(DAEMON_ONLY_SANITIZE | DAEMON_CLOSE_EXTRA_FDS, NULL);
265
fe7cd64 don't pass argc in getopt32, it's superfluous
Denis Vlasenko authored
266 opt = getopt32(argv, "f:h:p", &opt_user, &opt_host);
66fabdb login: apply fixes + getopt_ulflag'ification by Bernhard
Denis Vlasenko authored
267 if (opt & LOGIN_OPT_f) {
268 if (!amroot)
269 bb_error_msg_and_die("-f is for root only");
22f6dcb login: fix getopt_ulflags fallout (wasn't taking username supplied by…
Denis Vlasenko authored
270 safe_strncpy(username, opt_user, sizeof(username));
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
271 }
1d42665 *: shrink: use Vladimir's "o+" specifier instead of xatou(opt_param)
Denis Vlasenko authored
272 argv += optind;
273 if (argv[0]) /* user from command line (getty) */
274 safe_strncpy(username, argv[0], sizeof(username));
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
275
9a9edf2 login: make it saner and smaller by ~0.5k.
Denis Vlasenko authored
276 /* Let's find out and memorize our tty */
942e429 login: previous commit comment was wrong :)
Denis Vlasenko authored
277 if (!isatty(0) || !isatty(1) || !isatty(2))
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
278 return EXIT_FAILURE; /* Must be a terminal */
9a9edf2 login: make it saner and smaller by ~0.5k.
Denis Vlasenko authored
279 safe_strncpy(full_tty, "UNKNOWN", sizeof(full_tty));
942e429 login: previous commit comment was wrong :)
Denis Vlasenko authored
280 tmp = ttyname(0);
9a9edf2 login: make it saner and smaller by ~0.5k.
Denis Vlasenko authored
281 if (tmp) {
282 safe_strncpy(full_tty, tmp, sizeof(full_tty));
283 if (strncmp(full_tty, "/dev/", 5) == 0)
284 short_tty = full_tty + 5;
285 }
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
286
c0415a9 login: nuke nonblock() - we have it in libbb; -400 bytes bss.
Denis Vlasenko authored
287 read_or_build_utent(&utent, !amroot);
c7bda1c Remove trailing whitespace. Update copyright to include 2004.
Eric Andersen authored
288
cdf6277 dos2unix: tiny shrink
Denis Vlasenko authored
289 if (opt & LOGIN_OPT_h) {
66fabdb login: apply fixes + getopt_ulflag'ification by Bernhard
Denis Vlasenko authored
290 USE_FEATURE_UTMP(
9a9edf2 login: make it saner and smaller by ~0.5k.
Denis Vlasenko authored
291 safe_strncpy(utent.ut_host, opt_host, sizeof(utent.ut_host));
66fabdb login: apply fixes + getopt_ulflag'ification by Bernhard
Denis Vlasenko authored
292 )
d6e81c7 login: optional support for PAM
Denis Vlasenko authored
293 fromhost = xasprintf(" on '%s' from '%s'", short_tty, opt_host);
c0415a9 login: nuke nonblock() - we have it in libbb; -400 bytes bss.
Denis Vlasenko authored
294 } else
d6e81c7 login: optional support for PAM
Denis Vlasenko authored
295 fromhost = xasprintf(" on '%s'", short_tty);
c7bda1c Remove trailing whitespace. Update copyright to include 2004.
Eric Andersen authored
296
d6e81c7 login: optional support for PAM
Denis Vlasenko authored
297 /* Was breaking "login <username>" from shell command line: */
298 /*bb_setpgrp();*/
0fbff13 Several login cleanups from vodz
Eric Andersen authored
299
8f8f268 bb_applet_name -> applet_name
Denis Vlasenko authored
300 openlog(applet_name, LOG_PID | LOG_CONS | LOG_NOWAIT, LOG_AUTH);
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
301
942e429 login: previous commit comment was wrong :)
Denis Vlasenko authored
302 while (1) {
6e1b62b flush typeahead before prompt
Paul Fox authored
303 /* flush away any type-ahead (as getty does) */
abbd363 xreadlink: code shrink
Denis Vlasenko authored
304 ioctl(0, TCFLSH, TCIFLUSH);
6e1b62b flush typeahead before prompt
Paul Fox authored
305
942e429 login: previous commit comment was wrong :)
Denis Vlasenko authored
306 if (!username[0])
9a9edf2 login: make it saner and smaller by ~0.5k.
Denis Vlasenko authored
307 get_username_or_die(username, sizeof(username));
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
308
d6e81c7 login: optional support for PAM
Denis Vlasenko authored
309 #if ENABLE_PAM
310 pamret = pam_start("login", username, &conv, &pamh);
311 if (pamret != PAM_SUCCESS) {
a29a5e4 login: fix PAM login (was unable to complete Kerberos login)
Denis Vlasenko authored
312 failed_msg = "start";
d6e81c7 login: optional support for PAM
Denis Vlasenko authored
313 goto pam_auth_failed;
314 }
315 /* set TTY (so things like securetty work) */
316 pamret = pam_set_item(pamh, PAM_TTY, short_tty);
317 if (pamret != PAM_SUCCESS) {
a29a5e4 login: fix PAM login (was unable to complete Kerberos login)
Denis Vlasenko authored
318 failed_msg = "set_item(TTY)";
d6e81c7 login: optional support for PAM
Denis Vlasenko authored
319 goto pam_auth_failed;
320 }
321 pamret = pam_authenticate(pamh, 0);
82f3b16 login: do reject wrong passwords with PAM auth
Denis Vlasenko authored
322 if (pamret != PAM_SUCCESS) {
a29a5e4 login: fix PAM login (was unable to complete Kerberos login)
Denis Vlasenko authored
323 failed_msg = "authenticate";
82f3b16 login: do reject wrong passwords with PAM auth
Denis Vlasenko authored
324 goto pam_auth_failed;
325 /* TODO: or just "goto auth_failed"
326 * since user seems to enter wrong password
327 * (in this case pamret == 7)
328 */
329 }
330 /* check that the account is healthy */
331 pamret = pam_acct_mgmt(pamh, 0);
332 if (pamret != PAM_SUCCESS) {
a29a5e4 login: fix PAM login (was unable to complete Kerberos login)
Denis Vlasenko authored
333 failed_msg = "acct_mgmt";
82f3b16 login: do reject wrong passwords with PAM auth
Denis Vlasenko authored
334 goto pam_auth_failed;
335 }
336 /* read user back */
a29a5e4 login: fix PAM login (was unable to complete Kerberos login)
Denis Vlasenko authored
337 pamuser = NULL;
338 /* gcc: "dereferencing type-punned pointer breaks aliasing rules..."
339 * thus we cast to (void*) */
340 if (pam_get_item(pamh, PAM_USER, (void*)&pamuser) != PAM_SUCCESS) {
341 failed_msg = "get_item(USER)";
342 goto pam_auth_failed;
d6e81c7 login: optional support for PAM
Denis Vlasenko authored
343 }
a29a5e4 login: fix PAM login (was unable to complete Kerberos login)
Denis Vlasenko authored
344 if (!pamuser || !pamuser[0])
345 goto auth_failed;
346 safe_strncpy(username, pamuser, sizeof(username));
347 /* Don't use "pw = getpwnam(username);",
348 * PAM is said to be capable of destroying static storage
349 * used by getpwnam(). We are using safe(r) function */
350 pw = NULL;
351 getpwnam_r(username, &pwdstruct, pwdbuf, sizeof(pwdbuf), &pw);
352 if (!pw)
353 goto auth_failed;
354 pamret = pam_open_session(pamh, 0);
355 if (pamret != PAM_SUCCESS) {
356 failed_msg = "open_session";
357 goto pam_auth_failed;
358 }
359 pamret = pam_setcred(pamh, PAM_ESTABLISH_CRED);
360 if (pamret != PAM_SUCCESS) {
361 failed_msg = "setcred";
362 goto pam_auth_failed;
363 }
364 break; /* success, continue login process */
365
d6e81c7 login: optional support for PAM
Denis Vlasenko authored
366 pam_auth_failed:
a29a5e4 login: fix PAM login (was unable to complete Kerberos login)
Denis Vlasenko authored
367 bb_error_msg("pam_%s call failed: %s (%d)", failed_msg,
368 pam_strerror(pamh, pamret), pamret);
d6e81c7 login: optional support for PAM
Denis Vlasenko authored
369 safe_strncpy(username, "UNKNOWN", sizeof(username));
370 #else /* not PAM */
942e429 login: previous commit comment was wrong :)
Denis Vlasenko authored
371 pw = getpwnam(username);
372 if (!pw) {
65e14b4 login: ask passwords even for wrong usernames.
Denis Vlasenko authored
373 strcpy(username, "UNKNOWN");
374 goto fake_it;
9a9edf2 login: make it saner and smaller by ~0.5k.
Denis Vlasenko authored
375 }
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
376
9a9edf2 login: make it saner and smaller by ~0.5k.
Denis Vlasenko authored
377 if (pw->pw_passwd[0] == '!' || pw->pw_passwd[0] == '*')
378 goto auth_failed;
c7bda1c Remove trailing whitespace. Update copyright to include 2004.
Eric Andersen authored
379
66fabdb login: apply fixes + getopt_ulflag'ification by Bernhard
Denis Vlasenko authored
380 if (opt & LOGIN_OPT_f)
9a9edf2 login: make it saner and smaller by ~0.5k.
Denis Vlasenko authored
381 break; /* -f USER: success without asking passwd */
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
382
9a9edf2 login: make it saner and smaller by ~0.5k.
Denis Vlasenko authored
383 if (pw->pw_uid == 0 && !check_securetty())
384 goto auth_failed;
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
385
386 /* Don't check the password if password entry is empty (!) */
942e429 login: previous commit comment was wrong :)
Denis Vlasenko authored
387 if (!pw->pw_passwd[0])
66fabdb login: apply fixes + getopt_ulflag'ification by Bernhard
Denis Vlasenko authored
388 break;
65e14b4 login: ask passwords even for wrong usernames.
Denis Vlasenko authored
389 fake_it:
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
390 /* authorization takes place here */
942e429 login: previous commit comment was wrong :)
Denis Vlasenko authored
391 if (correct_password(pw))
66fabdb login: apply fixes + getopt_ulflag'ification by Bernhard
Denis Vlasenko authored
392 break;
d6e81c7 login: optional support for PAM
Denis Vlasenko authored
393 #endif /* ENABLE_PAM */
0de3c55 login: remove setpgrp call (makes it work from shell prompt again).
Denis Vlasenko authored
394 auth_failed:
66fabdb login: apply fixes + getopt_ulflag'ification by Bernhard
Denis Vlasenko authored
395 opt &= ~LOGIN_OPT_f;
84cb767 @landley patch from tito: consolidate delay functions as bb_do_delay()
landley authored
396 bb_do_delay(FAIL_DELAY);
82f3b16 login: do reject wrong passwords with PAM auth
Denis Vlasenko authored
397 /* TODO: doesn't sound like correct English phrase to me */
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
398 puts("Login incorrect");
942e429 login: previous commit comment was wrong :)
Denis Vlasenko authored
399 if (++count == 3) {
89f0b34 rodata cleanup. "unable to" == "cannot". -300 bytes
Denis Vlasenko authored
400 syslog(LOG_WARNING, "invalid password for '%s'%s",
9a9edf2 login: make it saner and smaller by ~0.5k.
Denis Vlasenko authored
401 username, fromhost);
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
402 return EXIT_FAILURE;
942e429 login: previous commit comment was wrong :)
Denis Vlasenko authored
403 }
9a9edf2 login: make it saner and smaller by ~0.5k.
Denis Vlasenko authored
404 username[0] = '\0';
0fbff13 Several login cleanups from vodz
Eric Andersen authored
405 }
c7bda1c Remove trailing whitespace. Update copyright to include 2004.
Eric Andersen authored
406
942e429 login: previous commit comment was wrong :)
Denis Vlasenko authored
407 alarm(0);
68404f1 *: add -Wunused-parameter; fix resulting breakage
Denis Vlasenko authored
408 if (!amroot)
409 die_if_nologin();
60158cb @landley A patch from Takeharu KATO to update/fix SE-Linux support.
landley authored
410
c0415a9 login: nuke nonblock() - we have it in libbb; -400 bytes bss.
Denis Vlasenko authored
411 write_utent(&utent, username);
60158cb @landley A patch from Takeharu KATO to update/fix SE-Linux support.
landley authored
412
f312e32 login: make /etc/nologin support configurable. -240 bytes if not sele…
Denis Vlasenko authored
413 #if ENABLE_SELINUX
942e429 login: previous commit comment was wrong :)
Denis Vlasenko authored
414 if (is_selinux_enabled()) {
d1f8c1c @landley From Jan Kiszka: This patch fixes the security labelling of the login…
landley authored
415 security_context_t old_tty_sid, new_tty_sid;
9e48045 Patch from Russell Coker:
Eric Andersen authored
416
942e429 login: previous commit comment was wrong :)
Denis Vlasenko authored
417 if (get_default_context(username, NULL, &user_sid)) {
89f0b34 rodata cleanup. "unable to" == "cannot". -300 bytes
Denis Vlasenko authored
418 bb_error_msg_and_die("cannot get SID for %s",
6bbd174 login: small fixes like \n removal, bb_error_msg'ification, etc.
Denis Vlasenko authored
419 username);
9e48045 Patch from Russell Coker:
Eric Andersen authored
420 }
942e429 login: previous commit comment was wrong :)
Denis Vlasenko authored
421 if (getfilecon(full_tty, &old_tty_sid) < 0) {
4a5cf16 login: use %s - we know that string is not too long there
Denis Vlasenko authored
422 bb_perror_msg_and_die("getfilecon(%s) failed",
6bbd174 login: small fixes like \n removal, bb_error_msg'ification, etc.
Denis Vlasenko authored
423 full_tty);
9e48045 Patch from Russell Coker:
Eric Andersen authored
424 }
6bbd174 login: small fixes like \n removal, bb_error_msg'ification, etc.
Denis Vlasenko authored
425 if (security_compute_relabel(user_sid, old_tty_sid,
426 SECCLASS_CHR_FILE, &new_tty_sid) != 0) {
4a5cf16 login: use %s - we know that string is not too long there
Denis Vlasenko authored
427 bb_perror_msg_and_die("security_change_sid(%s) failed",
6bbd174 login: small fixes like \n removal, bb_error_msg'ification, etc.
Denis Vlasenko authored
428 full_tty);
9e48045 Patch from Russell Coker:
Eric Andersen authored
429 }
942e429 login: previous commit comment was wrong :)
Denis Vlasenko authored
430 if (setfilecon(full_tty, new_tty_sid) != 0) {
4a5cf16 login: use %s - we know that string is not too long there
Denis Vlasenko authored
431 bb_perror_msg_and_die("chsid(%s, %s) failed",
6bbd174 login: small fixes like \n removal, bb_error_msg'ification, etc.
Denis Vlasenko authored
432 full_tty, new_tty_sid);
9e48045 Patch from Russell Coker:
Eric Andersen authored
433 }
434 }
435 #endif
2f50aa4 login: use some ideas from util-linux's login.
Denis Vlasenko authored
436 /* Try these, but don't complain if they fail.
437 * _f_chown is safe wrt race t=ttyname(0);...;chown(t); */
438 fchown(0, pw->pw_uid, pw->pw_gid);
439 fchmod(0, 0600);
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
440
5281630 login: clear dangerous environment variables if started by non-root
Denis Vlasenko authored
441 /* We trust environment only if we run by root */
442 if (ENABLE_LOGIN_SCRIPTS && amroot) {
53091ec Attempt to get more applets compile for NOMMU.
Denis Vlasenko authored
443 char *t_argv[2];
444
445 t_argv[0] = getenv("LOGIN_PRE_SUID_SCRIPT");
446 if (t_argv[0]) {
447 t_argv[1] = NULL;
0de3c55 login: remove setpgrp call (makes it work from shell prompt again).
Denis Vlasenko authored
448 xsetenv("LOGIN_TTY", full_tty);
449 xsetenv("LOGIN_USER", pw->pw_name);
450 xsetenv("LOGIN_UID", utoa(pw->pw_uid));
451 xsetenv("LOGIN_GID", utoa(pw->pw_gid));
452 xsetenv("LOGIN_SHELL", pw->pw_shell);
cdf6277 dos2unix: tiny shrink
Denis Vlasenko authored
453 spawn_and_wait(t_argv); /* NOMMU-friendly */
454 unsetenv("LOGIN_TTY" );
455 unsetenv("LOGIN_USER" );
456 unsetenv("LOGIN_UID" );
457 unsetenv("LOGIN_GID" );
458 unsetenv("LOGIN_SHELL");
2e50291 login: style fixes
Denis Vlasenko authored
459 }
460 }
461
942e429 login: previous commit comment was wrong :)
Denis Vlasenko authored
462 change_identity(pw);
463 tmp = pw->pw_shell;
464 if (!tmp || !*tmp)
dc4e75e move all "-/bin/sh" "/bin/sh" and "sh" to libbb/messages.c file as one
Glenn L McGrath authored
465 tmp = DEFAULT_SHELL;
cdf6277 dos2unix: tiny shrink
Denis Vlasenko authored
466 /* setup_environment params: shell, clear_env, change_env, pw */
467 setup_environment(tmp, !(opt & LOGIN_OPT_p), 1, pw);
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
468
942e429 login: previous commit comment was wrong :)
Denis Vlasenko authored
469 motd();
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
470
942e429 login: previous commit comment was wrong :)
Denis Vlasenko authored
471 if (pw->pw_uid == 0)
2f50aa4 login: use some ideas from util-linux's login.
Denis Vlasenko authored
472 syslog(LOG_INFO, "root login%s", fromhost);
f312e32 login: make /etc/nologin support configurable. -240 bytes if not sele…
Denis Vlasenko authored
473 #if ENABLE_SELINUX
d1f8c1c @landley From Jan Kiszka: This patch fixes the security labelling of the login…
landley authored
474 /* well, a simple setexeccon() here would do the job as well,
475 * but let's play the game for now */
476 set_current_security_context(user_sid);
9e48045 Patch from Russell Coker:
Eric Andersen authored
477 #endif
6ae8079 login: re-enable Ctrl-^C before execing shell.
Denis Vlasenko authored
478
479 // util-linux login also does:
480 // /* start new session */
481 // setsid();
482 // /* TIOCSCTTY: steal tty from other process group */
483 // if (ioctl(0, TIOCSCTTY, 1)) error_msg...
0de3c55 login: remove setpgrp call (makes it work from shell prompt again).
Denis Vlasenko authored
484 // BBox login used to do this (see above):
485 // bb_setpgrp();
486 // If this stuff is really needed, add it and explain why!
6ae8079 login: re-enable Ctrl-^C before execing shell.
Denis Vlasenko authored
487
8c76487 login: add big fat comment about SIGINT - prevent
Denis Vlasenko authored
488 /* set signals to defaults */
489 signal(SIGALRM, SIG_DFL);
490 /* Is this correct? This way user can ctrl-c out of /etc/profile,
491 * potentially creating security breach (tested with bash 3.0).
492 * But without this, bash 3.0 will not enable ctrl-c either.
493 * Maybe bash is buggy?
494 * Need to find out what standards say about /bin/login -
495 * should it leave SIGINT etc enabled or disabled? */
6ae8079 login: re-enable Ctrl-^C before execing shell.
Denis Vlasenko authored
496 signal(SIGINT, SIG_DFL);
497
a2f6101 setup_environment: code shrink
Denis Vlasenko authored
498 /* Exec login shell with no additional parameters */
499 run_shell(tmp, 1, NULL, NULL);
c7bda1c Remove trailing whitespace. Update copyright to include 2004.
Eric Andersen authored
500
a2f6101 setup_environment: code shrink
Denis Vlasenko authored
501 /* return EXIT_FAILURE; - not reached */
1fca558 Bigger patch for (partial) tinylogin integration
Robert Griebl authored
502 }
Something went wrong with that request. Please try again.