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