xref: /dragonfly/lib/libpam/libpam/pam_debug_log.c (revision 2cd2d2b5)
1 /*-
2  * Copyright 2001 Mark R V Murray
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  *
26  * $FreeBSD: src/lib/libpam/libpam/pam_debug_log.c,v 1.8.2.2 2002/07/03 21:45:44 des Exp $
27  * $DragonFly: src/lib/libpam/libpam/Attic/pam_debug_log.c,v 1.2 2003/06/17 04:26:50 dillon Exp $
28  */
29 
30 #include <libgen.h>
31 #include <stdarg.h>
32 #include <stdio.h>
33 #include <stdlib.h>
34 #include <string.h>
35 #include <syslog.h>
36 
37 #include <security/pam_modules.h>
38 #include <security/pam_mod_misc.h>
39 
40 #define	FMTBUFSIZ	256
41 
42 static char *modulename(const char *);
43 
44 /* Log a debug message, including the function name and a
45  * cleaned up filename.
46  */
47 void
48 _pam_log(struct options *options, const char *file, const char *function,
49     const char *format, ...)
50 {
51 	va_list ap;
52 	char *fmtbuf, *modname;
53 
54 	if (pam_test_option(options, PAM_OPT_DEBUG, NULL)) {
55 		modname = modulename(file);
56 		va_start(ap, format);
57 		asprintf(&fmtbuf, "%s: %s: %s", modname, function, format);
58 		vsyslog(LOG_DEBUG, fmtbuf, ap);
59 		free(fmtbuf);
60 		va_end(ap);
61 	}
62 }
63 
64 /* Log a return value, including the function name and a
65  * cleaned up filename.
66  */
67 void
68 _pam_log_retval(struct options *options, const char *file, const char *function,
69     int retval)
70 {
71 	char *modname;
72 
73 	if (pam_test_option(options, PAM_OPT_DEBUG, NULL)) {
74 		modname = modulename(file);
75 
76 		switch (retval) {
77 		case PAM_SUCCESS:
78 			syslog(LOG_DEBUG, "%s: %s: returning PAM_SUCCESS",
79 			    modname, function);
80 			break;
81 		case PAM_AUTH_ERR:
82 			syslog(LOG_DEBUG, "%s: %s: returning PAM_AUTH_ERR",
83 			    modname, function);
84 			break;
85 		case PAM_IGNORE:
86 			syslog(LOG_DEBUG, "%s: %s: returning PAM_IGNORE",
87 			    modname, function);
88 			break;
89 		case PAM_PERM_DENIED:
90 			syslog(LOG_DEBUG, "%s: %s: returning PAM_PERM_DENIED",
91 			    modname, function);
92 			break;
93 		default:
94 			syslog(LOG_DEBUG, "%s: %s: returning (%d)",
95 			    modname, function, retval);
96 		}
97 
98 		free(modname);
99 	}
100 }
101 
102 /* Print a verbose error, including the function name and a
103  * cleaned up filename.
104  */
105 void
106 _pam_verbose_error(pam_handle_t *pamh, struct options *options,
107     const char *file, const char *function, const char *format, ...)
108 {
109 	va_list ap;
110 	char *statusmsg, *fmtbuf, *modname;
111 
112 	if (!pam_test_option(options, PAM_OPT_NO_WARN, NULL)) {
113 		modname = modulename(file);
114 		va_start(ap, format);
115 		asprintf(&fmtbuf, "%s: %s: %s", modname, function, format);
116 		vasprintf(&statusmsg, fmtbuf, ap);
117 		pam_prompt(pamh, PAM_ERROR_MSG, statusmsg, NULL);
118 		free(statusmsg);
119 		free(fmtbuf);
120 		va_end(ap);
121 	}
122 }
123 
124 static char *
125 modulename(const char *file)
126 {
127 	char *modname, *period;
128 
129 	modname = strdup(basename(file));
130 	period = strchr(modname, '.');
131 	if (period != NULL)
132 		*period = '\0';
133 
134 	return modname;
135 }
136