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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1156,34 +1156,25 @@ sudoers_policy_version(int verbose)
{
struct sudo_conv_message msg;
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) {
putchar('\n');
(void) printf("Sudoers path: %s\n", _PATH_SUDOERS);
sudo_printf(SUDO_CONV_INFO_MSG, "\nSudoers path: %s\n", _PATH_SUDOERS);
#ifdef HAVE_LDAP
# 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
(void) printf("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.conf path: %s\n", _PATH_LDAP_CONF);
sudo_printf(SUDO_CONV_INFO_MSG, "ldap.secret path: %s\n", _PATH_LDAP_SECRET);
#endif
dump_auth_methods();
dump_defaults();
sudo_printf(SUDO_CONV_INFO_MSG, "\n");
dump_interfaces();
sudo_printf(SUDO_CONV_INFO_MSG, "\n");
}
#endif
return TRUE;
}

View File

@@ -55,6 +55,7 @@
# include <netgroup.h>
#endif /* HAVE_NETGROUP_H */
#include <ctype.h>
#include <errno.h>
#include <pwd.h>
#include <grp.h>
#include <netinet/in.h>
@@ -71,27 +72,8 @@
#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 *);
void dump_sudoers(void);
void print_defaults(void);
@@ -100,6 +82,7 @@ void print_userspecs(void);
void usage(void) __attribute__((__noreturn__));
void set_runasgr(char *);
void set_runaspw(char *);
static int testsudoers_printf(int msg_type, const char *fmt, ...);
extern void setgrfile(const char *);
extern void setgrent(void);
@@ -114,6 +97,29 @@ extern struct passwd *getpwent(void);
extern struct passwd *getpwnam(const char *);
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
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
dump_sudoers(void)
{

View File

@@ -108,6 +108,7 @@ static int install_sudoers(struct sudoersfile *, int);
static int print_unused(void *, void *);
static int reparse_sudoers(char *, char *, int, int);
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_undefined(char *name, int, int, int);
static void setup_signals(void);
@@ -136,6 +137,7 @@ int num_interfaces;
struct interface *interfaces;
struct sudo_user sudo_user;
struct passwd *list_pw;
sudo_printf_t sudo_printf = visudo_printf;
static struct sudoerslist {
struct sudoersfile *first, *last;
} sudoerslist;
@@ -1158,3 +1160,28 @@ usage(void)
getprogname());
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;
}