xref: /openbsd-src/usr.sbin/ldapd/logmsg.c (revision ae3cb403620ab940fbaabb3055fac045a63d56b7)
1 /*	$OpenBSD: logmsg.c,v 1.1 2017/01/20 11:55:08 benno Exp $	*/
2 
3 /*
4  * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15  * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 #include <sys/types.h>
20 #include <sys/queue.h>
21 #include <sys/socket.h>
22 #include <sys/time.h>
23 
24 #include <errno.h>
25 #include <netdb.h>
26 #include <stdarg.h>
27 #include <stdio.h>
28 #include <stdlib.h>
29 #include <string.h>
30 #include <syslog.h>
31 #include <time.h>
32 #include <unistd.h>
33 #include <vis.h>
34 
35 #include "ldapd.h"
36 #include "log.h"
37 
38 extern int	debug;
39 extern int	verbose;
40 
41 const char *
42 print_host(struct sockaddr_storage *ss, char *buf, size_t len)
43 {
44 	if (getnameinfo((struct sockaddr *)ss, ss->ss_len,
45 	    buf, len, NULL, 0, NI_NUMERICHOST) != 0) {
46 		buf[0] = '\0';
47 		return (NULL);
48 	}
49 	return (buf);
50 }
51 
52 void
53 hexdump(void *data, size_t len, const char *fmt, ...)
54 {
55 	uint8_t *p = data;
56 	va_list ap;
57 
58 	if (verbose < 2 || !debug)
59 		return;
60 
61 	va_start(ap, fmt);
62 	vlog(LOG_DEBUG, fmt, ap);
63 	va_end(ap);
64 
65 	while (len--) {
66 		size_t ofs = p - (uint8_t *)data;
67 		if (ofs % 16 == 0)
68 			fprintf(stderr, "%s%04lx:", ofs == 0 ? "" : "\n", ofs);
69 		else if (ofs % 8 == 0)
70 			fprintf(stderr, " ");
71 		fprintf(stderr, " %02x", *p++);
72 	}
73 	fprintf(stderr, "\n");
74 }
75 
76 /*
77  * Display a list of ber elements.
78  *
79  */
80 void
81 ldap_debug_elements(struct ber_element *root, int context, const char *fmt, ...)
82 {
83 	va_list		 ap;
84 	static int	 indent = 0;
85 	long long	 v;
86 	int		 d;
87 	char		*buf, *visbuf;
88 	size_t		 len;
89 	u_int		 i;
90 	int		 constructed;
91 	struct ber_oid	 o;
92 
93 	if (verbose < 2 || !debug)
94 		return;
95 
96 	if (fmt != NULL) {
97 		va_start(ap, fmt);
98 		vlog(LOG_DEBUG, fmt, ap);
99 		va_end(ap);
100 	}
101 
102 	/* calculate lengths */
103 	ber_calc_len(root);
104 
105 	switch (root->be_encoding) {
106 	case BER_TYPE_SEQUENCE:
107 	case BER_TYPE_SET:
108 		constructed = root->be_encoding;
109 		break;
110 	default:
111 		constructed = 0;
112 		break;
113 	}
114 
115 	fprintf(stderr, "%*slen %lu ", indent, "", root->be_len);
116 	switch (root->be_class) {
117 	case BER_CLASS_UNIVERSAL:
118 		fprintf(stderr, "class: universal(%u) type: ", root->be_class);
119 		switch (root->be_type) {
120 		case BER_TYPE_EOC:
121 			fprintf(stderr, "end-of-content");
122 			break;
123 		case BER_TYPE_BOOLEAN:
124 			fprintf(stderr, "boolean");
125 			break;
126 		case BER_TYPE_INTEGER:
127 			fprintf(stderr, "integer");
128 			break;
129 		case BER_TYPE_BITSTRING:
130 			fprintf(stderr, "bit-string");
131 			break;
132 		case BER_TYPE_OCTETSTRING:
133 			fprintf(stderr, "octet-string");
134 			break;
135 		case BER_TYPE_NULL:
136 			fprintf(stderr, "null");
137 			break;
138 		case BER_TYPE_OBJECT:
139 			fprintf(stderr, "object");
140 			break;
141 		case BER_TYPE_ENUMERATED:
142 			fprintf(stderr, "enumerated");
143 			break;
144 		case BER_TYPE_SEQUENCE:
145 			fprintf(stderr, "sequence");
146 			break;
147 		case BER_TYPE_SET:
148 			fprintf(stderr, "set");
149 			break;
150 		}
151 		break;
152 	case BER_CLASS_APPLICATION:
153 		fprintf(stderr, "class: application(%u) type: ",
154 		    root->be_class);
155 		switch (root->be_type) {
156 		case LDAP_REQ_BIND:
157 		case LDAP_RES_BIND:
158 			fprintf(stderr, "bind");
159 			break;
160 		case LDAP_REQ_UNBIND_30:
161 			fprintf(stderr, "unbind");
162 			break;
163 		case LDAP_REQ_SEARCH:
164 			fprintf(stderr, "search");
165 			break;
166 		case LDAP_RES_SEARCH_ENTRY:
167 			fprintf(stderr, "search entry");
168 			break;
169 		case LDAP_RES_SEARCH_RESULT:
170 			fprintf(stderr, "search result");
171 			break;
172 		case LDAP_REQ_MODIFY:
173 		case LDAP_RES_MODIFY:
174 			fprintf(stderr, "modify");
175 			break;
176 		case LDAP_REQ_ADD:
177 		case LDAP_RES_ADD:
178 			fprintf(stderr, "add");
179 			break;
180 		case LDAP_REQ_DELETE_30:
181 		case LDAP_RES_DELETE:
182 			fprintf(stderr, "delete");
183 			break;
184 		case LDAP_REQ_MODRDN:
185 		case LDAP_RES_MODRDN:
186 			fprintf(stderr, "modrdn");
187 			break;
188 		case LDAP_REQ_COMPARE:
189 		case LDAP_RES_COMPARE:
190 			fprintf(stderr, "compare");
191 			break;
192 		case LDAP_REQ_ABANDON_30:
193 			fprintf(stderr, "abandon");
194 			break;
195 		case LDAP_REQ_EXTENDED:
196 		case LDAP_RES_EXTENDED:
197 			fprintf(stderr, "extended");
198 			break;
199 		}
200 		break;
201 	case BER_CLASS_PRIVATE:
202 		fprintf(stderr, "class: private(%u) type: ", root->be_class);
203 		fprintf(stderr, "encoding (%lu) type: ", root->be_encoding);
204 		break;
205 	case BER_CLASS_CONTEXT:
206 		fprintf(stderr, "class: context(%u) type: ", root->be_class);
207 		switch (context) {
208 		case LDAP_REQ_BIND:
209 			switch(root->be_type) {
210 			case LDAP_AUTH_SIMPLE:
211 				fprintf(stderr, "auth simple");
212 				break;
213 			}
214 			break;
215 		case LDAP_REQ_SEARCH:
216 			switch(root->be_type) {
217 			case LDAP_FILT_AND:
218 				fprintf(stderr, "and");
219 				break;
220 			case LDAP_FILT_OR:
221 				fprintf(stderr, "or");
222 				break;
223 			case LDAP_FILT_NOT:
224 				fprintf(stderr, "not");
225 				break;
226 			case LDAP_FILT_EQ:
227 				fprintf(stderr, "equal");
228 				break;
229 			case LDAP_FILT_SUBS:
230 				fprintf(stderr, "substring");
231 				break;
232 			case LDAP_FILT_GE:
233 				fprintf(stderr, "greater-or-equal");
234 				break;
235 			case LDAP_FILT_LE:
236 				fprintf(stderr, "less-or-equal");
237 				break;
238 			case LDAP_FILT_PRES:
239 				fprintf(stderr, "presence");
240 				break;
241 			case LDAP_FILT_APPR:
242 				fprintf(stderr, "approximate");
243 				break;
244 			}
245 			break;
246 		}
247 		break;
248 	default:
249 		fprintf(stderr, "class: <INVALID>(%u) type: ", root->be_class);
250 		break;
251 	}
252 	fprintf(stderr, "(%lu) encoding %lu ",
253 	    root->be_type, root->be_encoding);
254 
255 	if (constructed)
256 		root->be_encoding = constructed;
257 
258 	switch (root->be_encoding) {
259 	case BER_TYPE_BOOLEAN:
260 		if (ber_get_boolean(root, &d) == -1) {
261 			fprintf(stderr, "<INVALID>\n");
262 			break;
263 		}
264 		fprintf(stderr, "%s(%d)\n", d ? "true" : "false", d);
265 		break;
266 	case BER_TYPE_INTEGER:
267 		if (ber_get_integer(root, &v) == -1) {
268 			fprintf(stderr, "<INVALID>\n");
269 			break;
270 		}
271 		fprintf(stderr, "value %lld\n", v);
272 		break;
273 	case BER_TYPE_ENUMERATED:
274 		if (ber_get_enumerated(root, &v) == -1) {
275 			fprintf(stderr, "<INVALID>\n");
276 			break;
277 		}
278 		fprintf(stderr, "value %lld\n", v);
279 		break;
280 	case BER_TYPE_BITSTRING:
281 		if (ber_get_bitstring(root, (void *)&buf, &len) == -1) {
282 			fprintf(stderr, "<INVALID>\n");
283 			break;
284 		}
285 		fprintf(stderr, "hexdump ");
286 		for (i = 0; i < len; i++)
287 			fprintf(stderr, "%02x", buf[i]);
288 		fprintf(stderr, "\n");
289 		break;
290 	case BER_TYPE_OBJECT:
291 		if (ber_get_oid(root, &o) == -1) {
292 			fprintf(stderr, "<INVALID>\n");
293 			break;
294 		}
295 		fprintf(stderr, "\n");
296 		break;
297 	case BER_TYPE_OCTETSTRING:
298 		if (ber_get_nstring(root, (void *)&buf, &len) == -1) {
299 			fprintf(stderr, "<INVALID>\n");
300 			break;
301 		}
302 		if ((visbuf = malloc(len * 4 + 1)) != NULL) {
303 			strvisx(visbuf, buf, len, 0);
304 			fprintf(stderr, "string \"%s\"\n",  visbuf);
305 			free(visbuf);
306 		}
307 		break;
308 	case BER_TYPE_NULL:	/* no payload */
309 	case BER_TYPE_EOC:
310 	case BER_TYPE_SEQUENCE:
311 	case BER_TYPE_SET:
312 	default:
313 		fprintf(stderr, "\n");
314 		break;
315 	}
316 
317 	if (constructed && root->be_sub) {
318 		indent += 2;
319 		ldap_debug_elements(root->be_sub, context, NULL);
320 		indent -= 2;
321 	}
322 	if (root->be_next)
323 		ldap_debug_elements(root->be_next, context, NULL);
324 }
325 
326