xref: /openbsd/usr.sbin/ldapd/logmsg.c (revision f6aab3d8)
1 /*	$OpenBSD: logmsg.c,v 1.5 2021/01/17 14:45:35 rob 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 static int	debug;
39 
40 void
41 ldap_loginit(const char *name, int d, int v)
42 {
43 	log_setverbose(v);
44 	if (name != NULL)
45 		log_procinit(name);
46 	debug = d;
47 }
48 
49 const char *
50 print_host(struct sockaddr_storage *ss, char *buf, size_t len)
51 {
52 	if (getnameinfo((struct sockaddr *)ss, ss->ss_len,
53 	    buf, len, NULL, 0, NI_NUMERICHOST) != 0) {
54 		buf[0] = '\0';
55 		return (NULL);
56 	}
57 	return (buf);
58 }
59 
60 void
61 hexdump(void *data, size_t len, const char *fmt, ...)
62 {
63 	uint8_t *p = data;
64 	va_list ap;
65 
66 	if (log_getverbose() < 2 || !debug)
67 		return;
68 
69 	va_start(ap, fmt);
70 	vlog(LOG_DEBUG, fmt, ap);
71 	va_end(ap);
72 
73 	while (len--) {
74 		size_t ofs = p - (uint8_t *)data;
75 		if (ofs % 16 == 0)
76 			fprintf(stderr, "%s%04lx:", ofs == 0 ? "" : "\n", ofs);
77 		else if (ofs % 8 == 0)
78 			fprintf(stderr, " ");
79 		fprintf(stderr, " %02x", *p++);
80 	}
81 	fprintf(stderr, "\n");
82 }
83 
84 /*
85  * Display a list of ber elements.
86  *
87  */
88 void
89 ldap_debug_elements(struct ber_element *root, int context, const char *fmt, ...)
90 {
91 	va_list		 ap;
92 	static int	 indent = 0;
93 	long long	 v;
94 	int		 d;
95 	char		*buf, *visbuf;
96 	size_t		 len;
97 	u_int		 i;
98 	int		 constructed;
99 	struct ber_oid	 o;
100 
101 	if (log_getverbose() < 2 || !debug)
102 		return;
103 
104 	if (fmt != NULL) {
105 		va_start(ap, fmt);
106 		vlog(LOG_DEBUG, fmt, ap);
107 		va_end(ap);
108 	}
109 
110 	/* calculate lengths */
111 	ober_calc_len(root);
112 
113 	switch (root->be_encoding) {
114 	case BER_TYPE_SEQUENCE:
115 	case BER_TYPE_SET:
116 		constructed = root->be_encoding;
117 		break;
118 	default:
119 		constructed = 0;
120 		break;
121 	}
122 
123 	fprintf(stderr, "%*slen %lu ", indent, "", root->be_len);
124 	switch (root->be_class) {
125 	case BER_CLASS_UNIVERSAL:
126 		fprintf(stderr, "class: universal(%u) type: ", root->be_class);
127 		switch (root->be_type) {
128 		case BER_TYPE_EOC:
129 			fprintf(stderr, "end-of-content");
130 			break;
131 		case BER_TYPE_BOOLEAN:
132 			fprintf(stderr, "boolean");
133 			break;
134 		case BER_TYPE_INTEGER:
135 			fprintf(stderr, "integer");
136 			break;
137 		case BER_TYPE_BITSTRING:
138 			fprintf(stderr, "bit-string");
139 			break;
140 		case BER_TYPE_OCTETSTRING:
141 			fprintf(stderr, "octet-string");
142 			break;
143 		case BER_TYPE_NULL:
144 			fprintf(stderr, "null");
145 			break;
146 		case BER_TYPE_OBJECT:
147 			fprintf(stderr, "object");
148 			break;
149 		case BER_TYPE_ENUMERATED:
150 			fprintf(stderr, "enumerated");
151 			break;
152 		case BER_TYPE_SEQUENCE:
153 			fprintf(stderr, "sequence");
154 			break;
155 		case BER_TYPE_SET:
156 			fprintf(stderr, "set");
157 			break;
158 		}
159 		break;
160 	case BER_CLASS_APPLICATION:
161 		fprintf(stderr, "class: application(%u) type: ",
162 		    root->be_class);
163 		switch (root->be_type) {
164 		case LDAP_REQ_BIND:
165 		case LDAP_RES_BIND:
166 			fprintf(stderr, "bind");
167 			break;
168 		case LDAP_REQ_UNBIND_30:
169 			fprintf(stderr, "unbind");
170 			break;
171 		case LDAP_REQ_SEARCH:
172 			fprintf(stderr, "search");
173 			break;
174 		case LDAP_RES_SEARCH_ENTRY:
175 			fprintf(stderr, "search entry");
176 			break;
177 		case LDAP_RES_SEARCH_RESULT:
178 			fprintf(stderr, "search result");
179 			break;
180 		case LDAP_REQ_MODIFY:
181 		case LDAP_RES_MODIFY:
182 			fprintf(stderr, "modify");
183 			break;
184 		case LDAP_REQ_ADD:
185 		case LDAP_RES_ADD:
186 			fprintf(stderr, "add");
187 			break;
188 		case LDAP_REQ_DELETE_30:
189 		case LDAP_RES_DELETE:
190 			fprintf(stderr, "delete");
191 			break;
192 		case LDAP_REQ_MODRDN:
193 		case LDAP_RES_MODRDN:
194 			fprintf(stderr, "modrdn");
195 			break;
196 		case LDAP_REQ_COMPARE:
197 		case LDAP_RES_COMPARE:
198 			fprintf(stderr, "compare");
199 			break;
200 		case LDAP_REQ_ABANDON_30:
201 			fprintf(stderr, "abandon");
202 			break;
203 		case LDAP_REQ_EXTENDED:
204 		case LDAP_RES_EXTENDED:
205 			fprintf(stderr, "extended");
206 			break;
207 		}
208 		break;
209 	case BER_CLASS_PRIVATE:
210 		fprintf(stderr, "class: private(%u) type: ", root->be_class);
211 		fprintf(stderr, "encoding (%u) type: ", root->be_encoding);
212 		break;
213 	case BER_CLASS_CONTEXT:
214 		fprintf(stderr, "class: context(%u) type: ", root->be_class);
215 		switch (context) {
216 		case LDAP_REQ_BIND:
217 			switch(root->be_type) {
218 			case LDAP_AUTH_SIMPLE:
219 				fprintf(stderr, "auth simple");
220 				break;
221 			}
222 			break;
223 		case LDAP_REQ_SEARCH:
224 			switch(root->be_type) {
225 			case LDAP_FILT_AND:
226 				fprintf(stderr, "and");
227 				break;
228 			case LDAP_FILT_OR:
229 				fprintf(stderr, "or");
230 				break;
231 			case LDAP_FILT_NOT:
232 				fprintf(stderr, "not");
233 				break;
234 			case LDAP_FILT_EQ:
235 				fprintf(stderr, "equal");
236 				break;
237 			case LDAP_FILT_SUBS:
238 				fprintf(stderr, "substring");
239 				break;
240 			case LDAP_FILT_GE:
241 				fprintf(stderr, "greater-or-equal");
242 				break;
243 			case LDAP_FILT_LE:
244 				fprintf(stderr, "less-or-equal");
245 				break;
246 			case LDAP_FILT_PRES:
247 				fprintf(stderr, "presence");
248 				break;
249 			case LDAP_FILT_APPR:
250 				fprintf(stderr, "approximate");
251 				break;
252 			}
253 			break;
254 		}
255 		break;
256 	default:
257 		fprintf(stderr, "class: <INVALID>(%u) type: ", root->be_class);
258 		break;
259 	}
260 	fprintf(stderr, "(%u) encoding %u ",
261 	    root->be_type, root->be_encoding);
262 
263 	if (constructed)
264 		root->be_encoding = constructed;
265 
266 	switch (root->be_encoding) {
267 	case BER_TYPE_BOOLEAN:
268 		if (ober_get_boolean(root, &d) == -1) {
269 			fprintf(stderr, "<INVALID>\n");
270 			break;
271 		}
272 		fprintf(stderr, "%s(%d)\n", d ? "true" : "false", d);
273 		break;
274 	case BER_TYPE_INTEGER:
275 		if (ober_get_integer(root, &v) == -1) {
276 			fprintf(stderr, "<INVALID>\n");
277 			break;
278 		}
279 		fprintf(stderr, "value %lld\n", v);
280 		break;
281 	case BER_TYPE_ENUMERATED:
282 		if (ober_get_enumerated(root, &v) == -1) {
283 			fprintf(stderr, "<INVALID>\n");
284 			break;
285 		}
286 		fprintf(stderr, "value %lld\n", v);
287 		break;
288 	case BER_TYPE_BITSTRING:
289 		if (ober_get_bitstring(root, (void *)&buf, &len) == -1) {
290 			fprintf(stderr, "<INVALID>\n");
291 			break;
292 		}
293 		fprintf(stderr, "hexdump ");
294 		for (i = 0; i < len; i++)
295 			fprintf(stderr, "%02x", buf[i]);
296 		fprintf(stderr, "\n");
297 		break;
298 	case BER_TYPE_OBJECT:
299 		if (ober_get_oid(root, &o) == -1) {
300 			fprintf(stderr, "<INVALID>\n");
301 			break;
302 		}
303 		fprintf(stderr, "\n");
304 		break;
305 	case BER_TYPE_OCTETSTRING:
306 		if (ober_get_nstring(root, (void *)&buf, &len) == -1) {
307 			fprintf(stderr, "<INVALID>\n");
308 			break;
309 		}
310 		if ((visbuf = malloc(len * 4 + 1)) != NULL) {
311 			strvisx(visbuf, buf, len, 0);
312 			fprintf(stderr, "string \"%s\"\n",  visbuf);
313 			free(visbuf);
314 		}
315 		break;
316 	case BER_TYPE_NULL:	/* no payload */
317 	case BER_TYPE_EOC:
318 	case BER_TYPE_SEQUENCE:
319 	case BER_TYPE_SET:
320 	default:
321 		fprintf(stderr, "\n");
322 		break;
323 	}
324 
325 	if (constructed && root->be_sub) {
326 		indent += 2;
327 		ldap_debug_elements(root->be_sub, context, NULL);
328 		indent -= 2;
329 	}
330 	if (root->be_next)
331 		ldap_debug_elements(root->be_next, context, NULL);
332 }
333 
334