Use sudo_printf to display verbose version information.

This commit is contained in:
Todd C. Miller
2010-05-28 12:01:06 -04:00
parent 303d856065
commit 34e1a06767
8 changed files with 141 additions and 87 deletions

View File

@@ -293,22 +293,13 @@ int auth_end_session(void)
static void static void
pass_warn(void) pass_warn(void)
{ {
struct sudo_conv_message msg[2]; const char *warning = def_badpass_message;
struct sudo_conv_reply repl[2];
/* Call conversation function */
memset(msg, 0, sizeof(msg));
msg[0].msg_type = SUDO_CONV_ERROR_MSG;
#ifdef INSULT #ifdef INSULT
if (def_insults) if (def_insults)
msg[0].msg = INSULT; warning = INSULT;
else
#endif #endif
msg[0].msg = def_badpass_message; sudo_printf(SUDO_CONV_ERROR_MSG, "%s\n", warning);
msg[1].msg_type = SUDO_CONV_ERROR_MSG;
msg[1].msg = "\n";
memset(&repl, 0, sizeof(repl));
sudo_conv(2, msg, repl);
} }
char * char *
@@ -328,16 +319,13 @@ auth_getpass(const char *prompt, int timeout, int type)
return repl.reply; return repl.reply;
} }
#ifdef notyet
void void
dump_auth_methods(void) dump_auth_methods(void)
{ {
sudo_auth *auth; sudo_auth *auth;
/* XXX - conversation function */ sudo_printf(SUDO_CONV_INFO_MSG, "Authentication methods:");
(void) fputs("Authentication methods:", stdout);
for (auth = auth_switch; auth->name; auth++) for (auth = auth_switch; auth->name; auth++)
(void) printf(" '%s'", auth->name); sudo_printf(SUDO_CONV_INFO_MSG, " '%s'", auth->name);
(void) putchar('\n'); sudo_printf(SUDO_CONV_INFO_MSG, "\n");
} }
#endif

View File

@@ -125,54 +125,60 @@ dump_defaults(void)
switch (cur->type & T_MASK) { switch (cur->type & T_MASK) {
case T_FLAG: case T_FLAG:
if (cur->sd_un.flag) if (cur->sd_un.flag)
puts(cur->desc); sudo_printf(SUDO_CONV_INFO_MSG, "%s\n", cur->desc);
break; break;
case T_STR: case T_STR:
if (cur->sd_un.str) { if (cur->sd_un.str) {
(void) printf(cur->desc, cur->sd_un.str); sudo_printf(SUDO_CONV_INFO_MSG,
putchar('\n'); cur->desc, cur->sd_un.str);
sudo_printf(SUDO_CONV_INFO_MSG, "\n");
} }
break; break;
case T_LOGFAC: case T_LOGFAC:
if (cur->sd_un.ival) { if (cur->sd_un.ival) {
(void) printf(cur->desc, logfac2str(cur->sd_un.ival)); sudo_printf(SUDO_CONV_INFO_MSG,
putchar('\n'); cur->desc, logfac2str(cur->sd_un.ival));
sudo_printf(SUDO_CONV_INFO_MSG, "\n");
} }
break; break;
case T_LOGPRI: case T_LOGPRI:
if (cur->sd_un.ival) { if (cur->sd_un.ival) {
(void) printf(cur->desc, logpri2str(cur->sd_un.ival)); sudo_printf(SUDO_CONV_INFO_MSG,
putchar('\n'); cur->desc, logpri2str(cur->sd_un.ival));
sudo_printf(SUDO_CONV_INFO_MSG, "\n");
} }
break; break;
case T_UINT: case T_UINT:
case T_INT: case T_INT:
(void) printf(cur->desc, cur->sd_un.ival); sudo_printf(SUDO_CONV_INFO_MSG, cur->desc, cur->sd_un.ival);
putchar('\n'); sudo_printf(SUDO_CONV_INFO_MSG, "\n");
break; break;
case T_FLOAT: case T_FLOAT:
(void) printf(cur->desc, cur->sd_un.fval); sudo_printf(SUDO_CONV_INFO_MSG, cur->desc, cur->sd_un.fval);
putchar('\n'); sudo_printf(SUDO_CONV_INFO_MSG, "\n");
break; break;
case T_MODE: case T_MODE:
(void) printf(cur->desc, cur->sd_un.mode); sudo_printf(SUDO_CONV_INFO_MSG, cur->desc, cur->sd_un.mode);
putchar('\n'); sudo_printf(SUDO_CONV_INFO_MSG, "\n");
break; break;
case T_LIST: case T_LIST:
if (cur->sd_un.list) { if (cur->sd_un.list) {
puts(cur->desc); sudo_printf(SUDO_CONV_INFO_MSG, "%s\n", cur->desc);
for (item = cur->sd_un.list; item; item = item->next) for (item = cur->sd_un.list; item; item = item->next) {
printf("\t%s\n", item->value); sudo_printf(SUDO_CONV_INFO_MSG,
"\t%s\n", item->value);
}
} }
break; break;
case T_TUPLE: case T_TUPLE:
for (def = cur->values; def->sval; def++) { for (def = cur->values; def->sval; def++) {
if (cur->sd_un.ival == def->ival) { if (cur->sd_un.ival == def->ival) {
(void) printf(cur->desc, def->sval); sudo_printf(SUDO_CONV_INFO_MSG,
cur->desc, def->sval);
break; break;
} }
} }
putchar('\n'); sudo_printf(SUDO_CONV_INFO_MSG, "\n");
break; break;
} }
} }
@@ -188,20 +194,24 @@ list_options(void)
struct sudo_defs_types *cur; struct sudo_defs_types *cur;
char *p; char *p;
(void) puts("Available options in a sudoers ``Defaults'' line:\n"); sudo_printf(SUDO_CONV_INFO_MSG,
"Available options in a sudoers ``Defaults'' line:\n\n");
for (cur = sudo_defs_table; cur->name; cur++) { for (cur = sudo_defs_table; cur->name; cur++) {
if (cur->name && cur->desc) { if (cur->name && cur->desc) {
switch (cur->type & T_MASK) { switch (cur->type & T_MASK) {
case T_FLAG: case T_FLAG:
(void) printf("%s: %s\n", cur->name, cur->desc); sudo_printf(SUDO_CONV_INFO_MSG,
"%s: %s\n", cur->name, cur->desc);
break; break;
default: default:
p = strrchr(cur->desc, ':'); p = strrchr(cur->desc, ':');
if (p) if (p) {
(void) printf("%s: %.*s\n", cur->name, sudo_printf(SUDO_CONV_INFO_MSG, "%s: %.*s\n",
(int) (p - cur->desc), cur->desc); cur->name, (int) (p - cur->desc), cur->desc);
else } else {
(void) printf("%s: %s\n", cur->name, cur->desc); sudo_printf(SUDO_CONV_INFO_MSG,
"%s: %s\n", cur->name, cur->desc);
}
break; break;
} }
} }

View File

@@ -333,12 +333,14 @@ dump_interfaces(void)
char addrbuf[INET6_ADDRSTRLEN], maskbuf[INET6_ADDRSTRLEN]; char addrbuf[INET6_ADDRSTRLEN], maskbuf[INET6_ADDRSTRLEN];
#endif #endif
puts("Local IP address and netmask pairs:"); sudo_printf(SUDO_CONV_INFO_MSG, "Local IP address and netmask pairs:\n");
for (i = 0; i < num_interfaces; i++) { for (i = 0; i < num_interfaces; i++) {
switch(interfaces[i].family) { switch(interfaces[i].family) {
case AF_INET: case AF_INET:
printf("\t%s / ", inet_ntoa(interfaces[i].addr.ip4)); sudo_printf(SUDO_CONV_INFO_MSG,
puts(inet_ntoa(interfaces[i].netmask.ip4)); "\t%s / ", inet_ntoa(interfaces[i].addr.ip4));
sudo_printf(SUDO_CONV_INFO_MSG, "%s\n",
inet_ntoa(interfaces[i].netmask.ip4));
break; break;
#ifdef HAVE_IN6_ADDR #ifdef HAVE_IN6_ADDR
case AF_INET6: case AF_INET6:
@@ -346,7 +348,8 @@ dump_interfaces(void)
addrbuf, sizeof(addrbuf)); addrbuf, sizeof(addrbuf));
inet_ntop(AF_INET6, &interfaces[i].netmask.ip6, inet_ntop(AF_INET6, &interfaces[i].netmask.ip6,
maskbuf, sizeof(maskbuf)); maskbuf, sizeof(maskbuf));
printf("\t%s / %s\n", addrbuf, maskbuf); sudo_printf(SUDO_CONV_INFO_MSG,
"\t%s / %s\n", addrbuf, maskbuf);
break; break;
#endif /* HAVE_IN6_ADDR */ #endif /* HAVE_IN6_ADDR */
} }

View File

@@ -190,6 +190,10 @@ sudoers_io_open(unsigned int version, sudo_conv_t conversation,
if (!sudo_printf) if (!sudo_printf)
sudo_printf = plugin_printf; sudo_printf = plugin_printf;
/* If we have no command (because -V was specified) just return. */
if (argc == 0)
return TRUE;
if (!def_transcript) if (!def_transcript)
return FALSE; return FALSE;

View File

@@ -523,7 +523,7 @@ display_bound_defaults(int dtype, struct lbuf *lbuf)
default: default:
return(-1); return(-1);
} }
/* printf("Per-%s Defaults entries:\n", dname); */ /* sudo_printf(SUDO_CONV_INFO_MSG, "Per-%s Defaults entries:\n", dname); */
tq_foreach_fwd(&defaults, d) { tq_foreach_fwd(&defaults, d) {
if (d->type != dtype) if (d->type != dtype)
continue; continue;
@@ -590,8 +590,8 @@ sudo_file_display_cmnd(struct sudo_nss *nss, struct passwd *pw)
} }
matched: matched:
if (match != NULL && !match->negated) { if (match != NULL && !match->negated) {
printf("%s%s%s\n", safe_cmnd, user_args ? " " : "", sudo_printf(SUDO_CONV_INFO_MSG, "%s%s%s\n",
user_args ? user_args : ""); safe_cmnd, user_args ? " " : "", user_args ? user_args : "");
rval = 0; rval = 0;
} }
return(rval); return(rval);

View File

@@ -1156,34 +1156,25 @@ sudoers_policy_version(int verbose)
{ {
struct sudo_conv_message msg; struct sudo_conv_message msg;
struct sudo_conv_reply repl; struct sudo_conv_reply repl;
char *str;
easprintf(&str, "Sudoers plugin version %s\n", PACKAGE_VERSION); sudo_printf(SUDO_CONV_INFO_MSG, "Sudoers plugin version %s\n",
PACKAGE_VERSION);
/* Call conversation function */
memset(&msg, 0, sizeof(msg));
msg.msg_type = SUDO_CONV_INFO_MSG;
msg.msg = str;
memset(&repl, 0, sizeof(repl));
sudo_conv(1, &msg, &repl);
free(str);
#ifdef notyet
if (verbose) { if (verbose) {
putchar('\n'); sudo_printf(SUDO_CONV_INFO_MSG, "\nSudoers path: %s\n", _PATH_SUDOERS);
(void) printf("Sudoers path: %s\n", _PATH_SUDOERS);
#ifdef HAVE_LDAP #ifdef HAVE_LDAP
# ifdef _PATH_NSSWITCH_CONF # ifdef _PATH_NSSWITCH_CONF
(void) printf("nsswitch path: %s\n", _PATH_NSSWITCH_CONF); sudo_printf(SUDO_CONV_INFO_MSG, "nsswitch path: %s\n", _PATH_NSSWITCH_CONF);
# endif # endif
(void) printf("ldap.conf path: %s\n", _PATH_LDAP_CONF); sudo_printf(SUDO_CONV_INFO_MSG, "ldap.conf path: %s\n", _PATH_LDAP_CONF);
(void) printf("ldap.secret path: %s\n", _PATH_LDAP_SECRET); sudo_printf(SUDO_CONV_INFO_MSG, "ldap.secret path: %s\n", _PATH_LDAP_SECRET);
#endif #endif
dump_auth_methods(); dump_auth_methods();
dump_defaults(); dump_defaults();
sudo_printf(SUDO_CONV_INFO_MSG, "\n");
dump_interfaces(); dump_interfaces();
sudo_printf(SUDO_CONV_INFO_MSG, "\n");
} }
#endif
return TRUE; return TRUE;
} }

View File

@@ -55,6 +55,7 @@
# include <netgroup.h> # include <netgroup.h>
#endif /* HAVE_NETGROUP_H */ #endif /* HAVE_NETGROUP_H */
#include <ctype.h> #include <ctype.h>
#include <errno.h>
#include <pwd.h> #include <pwd.h>
#include <grp.h> #include <grp.h>
#include <netinet/in.h> #include <netinet/in.h>
@@ -71,27 +72,8 @@
#endif /* HAVE_FNMATCH */ #endif /* HAVE_FNMATCH */
/* /*
* Globals * Function Prototypes
*/ */
int Argc, NewArgc;
char **Argv, **NewArgv;
int num_interfaces;
struct interface *interfaces;
struct sudo_user sudo_user;
struct passwd *list_pw;
extern int parse_error;
/* For getopt(3) */
extern char *optarg;
extern int optind;
#if defined(SUDO_DEVEL) && defined(__OpenBSD__)
extern char *malloc_options;
#endif
#ifdef YYDEBUG
extern int yydebug;
#endif
int print_alias(void *, void *); int print_alias(void *, void *);
void dump_sudoers(void); void dump_sudoers(void);
void print_defaults(void); void print_defaults(void);
@@ -100,6 +82,7 @@ void print_userspecs(void);
void usage(void) __attribute__((__noreturn__)); void usage(void) __attribute__((__noreturn__));
void set_runasgr(char *); void set_runasgr(char *);
void set_runaspw(char *); void set_runaspw(char *);
static int testsudoers_printf(int msg_type, const char *fmt, ...);
extern void setgrfile(const char *); extern void setgrfile(const char *);
extern void setgrent(void); extern void setgrent(void);
@@ -114,6 +97,29 @@ extern struct passwd *getpwent(void);
extern struct passwd *getpwnam(const char *); extern struct passwd *getpwnam(const char *);
extern struct passwd *getpwuid(uid_t); extern struct passwd *getpwuid(uid_t);
/*
* Globals
*/
int Argc, NewArgc;
char **Argv, **NewArgv;
int num_interfaces;
struct interface *interfaces;
struct sudo_user sudo_user;
struct passwd *list_pw;
extern int parse_error;
sudo_printf_t sudo_printf = testsudoers_printf;
/* For getopt(3) */
extern char *optarg;
extern int optind;
#if defined(SUDO_DEVEL) && defined(__OpenBSD__)
extern char *malloc_options;
#endif
#ifdef YYDEBUG
extern int yydebug;
#endif
int int
main(int argc, char *argv[]) main(int argc, char *argv[])
{ {
@@ -527,6 +533,31 @@ print_userspecs(void)
} }
} }
static int
testsudoers_printf(int msg_type, const char *fmt, ...)
{
va_list ap;
FILE *fp;
switch (msg_type) {
case SUDO_CONV_INFO_MSG:
fp = stdout;
break;
case SUDO_CONV_ERROR_MSG:
fp = stderr;
break;
default:
errno = EINVAL;
return -1;
}
va_start(ap, fmt);
vfprintf(fp, fmt, ap);
va_end(ap);
return 0;
}
void void
dump_sudoers(void) dump_sudoers(void)
{ {

View File

@@ -108,6 +108,7 @@ static int install_sudoers(struct sudoersfile *, int);
static int print_unused(void *, void *); static int print_unused(void *, void *);
static int reparse_sudoers(char *, char *, int, int); static int reparse_sudoers(char *, char *, int, int);
static int run_command(char *, char **); static int run_command(char *, char **);
static int visudo_printf(int msg_type, const char *fmt, ...);
static void print_selfref(char *name, int, int, int); static void print_selfref(char *name, int, int, int);
static void print_undefined(char *name, int, int, int); static void print_undefined(char *name, int, int, int);
static void setup_signals(void); static void setup_signals(void);
@@ -136,6 +137,7 @@ int num_interfaces;
struct interface *interfaces; struct interface *interfaces;
struct sudo_user sudo_user; struct sudo_user sudo_user;
struct passwd *list_pw; struct passwd *list_pw;
sudo_printf_t sudo_printf = visudo_printf;
static struct sudoerslist { static struct sudoerslist {
struct sudoersfile *first, *last; struct sudoersfile *first, *last;
} sudoerslist; } sudoerslist;
@@ -1158,3 +1160,28 @@ usage(void)
getprogname()); getprogname());
exit(1); exit(1);
} }
static int
visudo_printf(int msg_type, const char *fmt, ...)
{
va_list ap;
FILE *fp;
switch (msg_type) {
case SUDO_CONV_INFO_MSG:
fp = stdout;
break;
case SUDO_CONV_ERROR_MSG:
fp = stderr;
break;
default:
errno = EINVAL;
return -1;
}
va_start(ap, fmt);
vfprintf(fp, fmt, ap);
va_end(ap);
return 0;
}