lslogins: add functionality

Signed-off-by: Ondrej Oprala <ooprala@redhat.com>
This commit is contained in:
Ondrej Oprala 2014-04-07 18:24:19 +02:00 committed by Karel Zak
parent 78dd745089
commit 29cc2a5568
9 changed files with 891 additions and 88 deletions

1
.gitignore vendored
View File

@ -116,6 +116,7 @@ update.log
/lsblk /lsblk
/lscpu /lscpu
/lslocks /lslocks
/lslogins
/mcookie /mcookie
/mesg /mesg
/mkfs /mkfs

View File

@ -37,6 +37,7 @@ dist_noinst_HEADERS += \
include/pathnames.h \ include/pathnames.h \
include/procutils.h \ include/procutils.h \
include/randutils.h \ include/randutils.h \
include/readutmp.h \
include/rpmatch.h \ include/rpmatch.h \
include/setproctitle.h \ include/setproctitle.h \
include/strutils.h \ include/strutils.h \

View File

@ -26,7 +26,8 @@ libcommon_la_SOURCES = \
lib/timeutils.c \ lib/timeutils.c \
lib/ttyutils.c \ lib/ttyutils.c \
lib/xgetpass.c \ lib/xgetpass.c \
lib/exec_shell.c lib/exec_shell.c \
lib/readutmp.c
if LINUX if LINUX
libcommon_la_SOURCES += \ libcommon_la_SOURCES += \

View File

@ -165,6 +165,19 @@ newgrp_LDADD += -lcrypt
endif endif
endif # BUILD_NEWGRP endif # BUILD_NEWGRP
if BUILD_LSLOGINS
usrbin_exec_PROGRAMS += lslogins
dist_man_MANS += login-utils/lslogins.1
lslogins_SOURCES = \
login-utils/lslogins.c \
login-utils/logindefs.c \
login-utils/logindefs.h
lslogins_LDADD = $(LDADD) libcommon.la libsmartcols.la
lslogins_CFLAGS = $(AM_CFLAGS) -I$(ul_libsmartcols_incdir)
if HAVE_SELINUX
lslogins_LDADD += -lselinux
endif
endif # BUILD_LSLOGINS
if BUILD_VIPW if BUILD_VIPW
usrsbin_exec_PROGRAMS += vipw usrsbin_exec_PROGRAMS += vipw
@ -207,16 +220,3 @@ endif
if BUILD_VIPW if BUILD_VIPW
cd $(DESTDIR)$(usrsbin_execdir) && ln -sf vipw vigr cd $(DESTDIR)$(usrsbin_execdir) && ln -sf vipw vigr
endif endif
if BUILD_LSLOGINS
usrbin_exec_PROGRAMS += lslogins
dist_man_MANS += login-utils/lslogins.1
lslogins_SOURCES = \
login-utils/lslogins.c \
login-utils/lslogins.h
lslogins_LDADD = $(LDADD) libcommon.la libsmartcols.la
lslogins_CFLAGS = $(AM_CFLAGS) -I$(ul_libsmartcols_incdir)
if HAVE_SELINUX
lslogins_LDADD += -lselinux
endif
endif # BUILD_LSLOGINS

View File

@ -1248,7 +1248,7 @@ int main(int argc, char **argv)
endpwent(); endpwent();
cxt.quiet = get_hushlogin_status(pwd); cxt.quiet = get_hushlogin_status(pwd, 1);
log_utmp(&cxt); log_utmp(&cxt);
log_audit(&cxt, 1); log_audit(&cxt, 1);

View File

@ -307,7 +307,7 @@ int effective_access(const char *path, int mode)
* BSD setreuid(). * BSD setreuid().
*/ */
int get_hushlogin_status(struct passwd *pwd) int get_hushlogin_status(struct passwd *pwd, int force_check)
{ {
const char *files[] = { _PATH_HUSHLOGINS, _PATH_HUSHLOGIN, NULL }; const char *files[] = { _PATH_HUSHLOGINS, _PATH_HUSHLOGIN, NULL };
const char *file; const char *file;
@ -358,12 +358,13 @@ int get_hushlogin_status(struct passwd *pwd)
/* per-account setting */ /* per-account setting */
if (strlen(pwd->pw_dir) + sizeof(file) + 2 > sizeof(buf)) if (strlen(pwd->pw_dir) + sizeof(file) + 2 > sizeof(buf))
continue; continue;
else {
sprintf(buf, "%s/%s", pwd->pw_dir, file);
if (force_check) {
uid_t ruid = getuid(); uid_t ruid = getuid();
gid_t egid = getegid(); gid_t egid = getegid();
sprintf(buf, "%s/%s", pwd->pw_dir, file);
if (setregid(-1, pwd->pw_gid) == 0 && if (setregid(-1, pwd->pw_gid) == 0 &&
setreuid(0, pwd->pw_uid) == 0) setreuid(0, pwd->pw_uid) == 0)
ok = effective_access(buf, O_RDONLY) == 0; ok = effective_access(buf, O_RDONLY) == 0;
@ -377,6 +378,15 @@ int get_hushlogin_status(struct passwd *pwd)
if (ok) if (ok)
return 1; /* enabled by user */ return 1; /* enabled by user */
} }
else {
int rc;
rc = effective_access(buf, O_RDONLY);
if (rc == 0)
return 1;
else if (rc == -1 && errno == EACCES)
return -1;
}
} }
return 0; return 0;

View File

@ -9,6 +9,6 @@ extern const char *getlogindefs_str(const char *name, const char *dflt);
extern void free_getlogindefs_data(void); extern void free_getlogindefs_data(void);
extern int logindefs_setenv(const char *name, const char *conf, const char *dflt); extern int logindefs_setenv(const char *name, const char *conf, const char *dflt);
extern int effective_access(const char *path, int mode); extern int effective_access(const char *path, int mode);
extern int get_hushlogin_status(struct passwd *pwd); extern int get_hushlogin_status(struct passwd *pwd, int force_check);
#endif /* UTIL_LINUX_LOGINDEFS_H */ #endif /* UTIL_LINUX_LOGINDEFS_H */

View File

@ -73,6 +73,9 @@ Show extra information about users - home diretory, default login shell, passwor
\fB\-z\fR, \fB\-\-print0\fR \fB\-z\fR, \fB\-\-print0\fR
Delimit user entries with a nul character, instead of a newline. Delimit user entries with a nul character, instead of a newline.
.TP .TP
\fB\-Z\fR, \fB\-\-context\fR
Display the users' security context.
.TP
\fB\-h\fR, \fB\-\-help\fR \fB\-h\fR, \fB\-\-help\fR
Display help information and exit. Display help information and exit.
\fB\-v\fR, \fB\-\-version\fR \fB\-v\fR, \fB\-\-version\fR

File diff suppressed because it is too large Load Diff