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