Do logging and email sending in the locale specified by the

"sudoers_locale" setting ("C" by default).  Email send by sudo
includes MIME headers when the sudoers locale is not "C".
This commit is contained in:
Todd C. Miller
2011-01-28 16:11:47 -05:00
parent 39b9b97dbc
commit 807a9ca94b
5 changed files with 53 additions and 3 deletions

4
NEWS
View File

@@ -71,6 +71,10 @@ What's new in Sudo 1.7.5?
after validating the command so the sudoers entries do not need
to include the backslashes.
* Logging and email sending are now done in the locale specified
by the "sudoers_locale" setting ("C" by default). Email send by
sudo now includes MIME headers when "sudoers_locale" is not "C".
What's new in Sudo 1.7.4p6?
* A bug has been fixed in the I/O logging support that could cause

View File

@@ -352,6 +352,9 @@
/* Define to 1 if you have the <netgroup.h> header file. */
#undef HAVE_NETGROUP_H
/* Define to 1 if you have the `nl_langinfo' function. */
#undef HAVE_NL_LANGINFO
/* Define to 1 if you have the `openpty' function. */
#undef HAVE_OPENPTY

3
configure vendored
View File

@@ -15003,7 +15003,8 @@ fi
LIBS=$ac_save_LIBS
for ac_func in strrchr sysconf tzset strftime initgroups getgroups fstat \
regcomp setlocale getaddrinfo mbr_check_membership setrlimit64
regcomp setlocale nl_langinfo getaddrinfo mbr_check_membership \
setrlimit64
do :
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"

View File

@@ -1943,7 +1943,8 @@ dnl Function checks
dnl
AC_FUNC_GETGROUPS
AC_CHECK_FUNCS(strrchr sysconf tzset strftime initgroups getgroups fstat \
regcomp setlocale getaddrinfo mbr_check_membership setrlimit64)
regcomp setlocale nl_langinfo getaddrinfo mbr_check_membership \
setrlimit64)
AC_CHECK_FUNCS(getline, [], [
AC_LIBOBJ(getline)
AC_CHECK_FUNCS(fgetln)

View File

@@ -47,6 +47,12 @@
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif /* HAVE_UNISTD_H */
#ifdef HAVE_SETLOCALE
# include <locale.h>
#endif /* HAVE_SETLOCALE */
#ifdef HAVE_NL_LANGINFO
# include <langinfo.h>
#endif /* HAVE_NL_LANGINFO */
#include <pwd.h>
#include <grp.h>
#include <signal.h>
@@ -122,6 +128,12 @@ do_syslog(int pri, char *msg)
char *p, *tmp, save;
const char *fmt;
#ifdef HAVE_SETLOCALE
const char *old_locale = estrdup(setlocale(LC_ALL, NULL));
if (!setlocale(LC_ALL, def_sudoers_locale))
setlocale(LC_ALL, "C");
#endif /* HAVE_SETLOCALE */
/*
* Log the full line, breaking into multiple syslog(3) calls if necessary
*/
@@ -156,6 +168,11 @@ do_syslog(int pri, char *msg)
fmt = FMT_CONTD;
maxlen = MAXSYSLOGLEN - (sizeof(FMT_CONTD) - 6 + strlen(user_name));
}
#ifdef HAVE_SETLOCALE
setlocale(LC_ALL, old_locale);
efree((void *)old_locale);
#endif /* HAVE_SETLOCALE */
}
static void
@@ -178,6 +195,12 @@ do_logfile(char *msg)
} else {
time_t now;
#ifdef HAVE_SETLOCALE
const char *old_locale = estrdup(setlocale(LC_ALL, NULL));
if (!setlocale(LC_ALL, def_sudoers_locale))
setlocale(LC_ALL, "C");
#endif /* HAVE_SETLOCALE */
now = time(NULL);
if (def_loglinelen == 0) {
/* Don't pretty-print long log file lines (hard to grep) */
@@ -247,6 +270,11 @@ do_logfile(char *msg)
(void) fflush(fp);
(void) lock_file(fileno(fp), SUDO_UNLOCK);
(void) fclose(fp);
#ifdef HAVE_SETLOCALE
setlocale(LC_ALL, old_locale);
efree((void *)old_locale);
#endif /* HAVE_SETLOCALE */
}
}
@@ -410,7 +438,7 @@ send_mail(const char *fmt, ...)
"USER=root",
NULL
};
#endif
#endif /* NO_ROOT_MAILER */
/* Just return if mailer is disabled. */
if (!def_mailerpath || !def_mailto)
@@ -456,6 +484,14 @@ send_mail(const char *fmt, ...)
(void) dup2(fd, STDERR_FILENO);
}
#ifdef HAVE_SETLOCALE
if (!setlocale(LC_ALL, def_sudoers_locale)) {
setlocale(LC_ALL, "C");
efree(def_sudoers_locale);
def_sudoers_locale = estrdup("C");
}
#endif /* HAVE_SETLOCALE */
/* Close password, group and other fds so we don't leak. */
sudo_endpwent();
sudo_endgrent();
@@ -552,6 +588,11 @@ send_mail(const char *fmt, ...)
(void) fputc(*p, mail);
}
#ifdef HAVE_NL_LANGINFO
if (strcmp(def_sudoers_locale, "C") != 0)
(void) fprintf(mail, "\nContent-Type: text/plain; charset=\"%s\"\nContent-Transfer-Encoding: 8bit", nl_langinfo(CODESET));
#endif /* HAVE_NL_LANGINFO */
(void) fprintf(mail, "\n\n%s : %s : %s : ", user_host,
get_timestr(time(NULL), def_log_year), user_name);
va_start(ap, fmt);