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
ldap_loginit(const char * name,int d,int v)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 *
print_host(struct sockaddr_storage * ss,char * buf,size_t len)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
hexdump(void * data,size_t len,const char * fmt,...)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
ldap_debug_elements(struct ber_element * root,int context,const char * fmt,...)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