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