static PyObject *cp_ber_dump(PyObject *self, PyObject *args) { const uint8_t *ptr; int len; if ( !PyArg_ParseTuple(args, "s#", &ptr, &len) ) return NULL; ber_dump(ptr, len, 1); Py_INCREF(Py_None); return Py_None; }
void nsldapi_dump_connection( LDAP *ld, LDAPConn *lconns, int all ) { LDAPConn *lc; char msg[256]; /* CTIME for this platform doesn't use this. */ #if !defined(SUNOS4) && !defined(_WIN32) && !defined(LINUX) char buf[26]; #endif sprintf( msg, "** Connection%s:\n", all ? "s" : "" ); ber_err_print( msg ); for ( lc = lconns; lc != NULL; lc = lc->lconn_next ) { if ( lc->lconn_server != NULL ) { sprintf( msg, "* host: %s port: %d secure: %s%s\n", ( lc->lconn_server->lsrv_host == NULL ) ? "(null)" : lc->lconn_server->lsrv_host, lc->lconn_server->lsrv_port, ( lc->lconn_server->lsrv_options & LDAP_SRV_OPT_SECURE ) ? "Yes" : "No", ( lc->lconn_sb == ld->ld_sbp ) ? " (default)" : "" ); ber_err_print( msg ); } sprintf( msg, " refcnt: %d status: %s\n", lc->lconn_refcnt, ( lc->lconn_status == LDAP_CONNST_NEEDSOCKET ) ? "NeedSocket" : ( lc->lconn_status == LDAP_CONNST_CONNECTING ) ? "Connecting" : ( lc->lconn_status == LDAP_CONNST_DEAD ) ? "Dead" : "Connected" ); ber_err_print( msg ); sprintf( msg, " last used: %s", NSLDAPI_CTIME( (time_t *) &lc->lconn_lastused, buf, sizeof(buf) )); ber_err_print( msg ); if ( lc->lconn_ber != NULLBER ) { ber_err_print( " partial response has been received:\n" ); ber_dump( lc->lconn_ber, 1 ); } ber_err_print( "\n" ); if ( !all ) { break; } } }
int ber_log_dump( int errlvl, int loglvl, BerElement *ber, int inout ) { assert( ber != NULL ); assert( LBER_VALID( ber ) ); if ( !ber_log_check( errlvl, loglvl )) { return 0; } ber_dump(ber, inout); return 1; }
/* returns an LDAP error code */ static int re_encode_request( LDAP *ld, BerElement *origber, int msgid, LDAPURLDesc *ludp, BerElement **berp ) { /* * XXX this routine knows way too much about how the lber library works! */ ber_uint_t along; ber_tag_t tag; ber_int_t ver; int rc; BerElement *ber; struct berelement tmpber; char *dn, *orig_dn; LDAPDebug( LDAP_DEBUG_TRACE, "re_encode_request: new msgid %d, new dn <%s>\n", msgid, ( ludp->lud_dn == NULL ) ? "NONE" : ludp->lud_dn, 0 ); tmpber = *origber; /* * All LDAP requests are sequences that start with a message id. For * everything except delete requests, this is followed by a sequence * that is tagged with the operation code. For deletes, there is just * a DN that is tagged with the operation code. */ /* skip past msgid and get operation tag */ if ( ber_scanf( &tmpber, "{it", &along, &tag ) == LBER_ERROR ) { return( LDAP_DECODING_ERROR ); } /* * XXXmcs: we don't support scope or filters in search referrals yet, * so if either were present we return an error which is probably * better than just ignoring the extra info. */ if ( tag == LDAP_REQ_SEARCH && ( ludp->lud_scope != -1 || ludp->lud_filter != NULL )) { return( LDAP_LOCAL_ERROR ); } if ( tag == LDAP_REQ_BIND ) { /* bind requests have a version number before the DN */ rc = ber_scanf( &tmpber, "{ia", &ver, &orig_dn ); } else if ( tag == LDAP_REQ_DELETE ) { /* delete requests DNs are not within a sequence */ rc = ber_scanf( &tmpber, "a", &orig_dn ); } else { rc = ber_scanf( &tmpber, "{a", &orig_dn ); } if ( rc == LBER_ERROR ) { return( LDAP_DECODING_ERROR ); } if ( ludp->lud_dn == NULL ) { dn = orig_dn; } else { dn = ludp->lud_dn; NSLDAPI_FREE( orig_dn ); orig_dn = NULL; } /* allocate and build the new request */ if (( rc = nsldapi_alloc_ber_with_options( ld, &ber )) != LDAP_SUCCESS ) { if ( orig_dn != NULL ) { NSLDAPI_FREE( orig_dn ); } return( rc ); } if ( tag == LDAP_REQ_BIND ) { rc = ber_printf( ber, "{it{is", msgid, tag, (int)ver /* XXX lossy cast */, dn ); } else if ( tag == LDAP_REQ_DELETE ) { rc = ber_printf( ber, "{its}", msgid, tag, dn ); } else { rc = ber_printf( ber, "{it{s", msgid, tag, dn ); } if ( orig_dn != NULL ) { NSLDAPI_FREE( orig_dn ); } /* * can't use "dn" or "orig_dn" from this point on (they've been freed) */ if ( rc == -1 ) { ber_free( ber, 1 ); return( LDAP_ENCODING_ERROR ); } if ( tag != LDAP_REQ_DELETE && ( ber_write( ber, tmpber.ber_ptr, ( tmpber.ber_end - tmpber.ber_ptr ), 0 ) != ( tmpber.ber_end - tmpber.ber_ptr ) || ber_printf( ber, "}}" ) == -1 )) { ber_free( ber, 1 ); return( LDAP_ENCODING_ERROR ); } #ifdef LDAP_DEBUG if ( ldap_debug & LDAP_DEBUG_PACKETS ) { LDAPDebug( LDAP_DEBUG_ANY, "re_encode_request new request is:\n", 0, 0, 0 ); ber_dump( ber, 0 ); } #endif /* LDAP_DEBUG */ *berp = ber; return( LDAP_SUCCESS ); }
void ber_dump(const uint8_t *buf, size_t len, unsigned int depth) { const uint8_t *end = buf + len; uint32_t clen, num, i; uint8_t idb; #if 0 const char * const clsname[]={ "universal", "application", "context-specific", "private", }; #endif again: if ( buf >= end ) return; idb = *buf; num = ber_id_octet_tag(*buf); buf++; /* FIXME: if ( tag == 0x1f ) get rest of type... */ if ( num >= 0x1f ) { for(num = 0, i = 0; buf < end; i++) { num <<= 7; num |= *buf & 0x7f; buf++; if ( !(*buf & 0x80) ) break; } } printf("%*c.tag = %u (0x%x)\n", depth, ' ', num, num); if ( buf >= end ) return; if ( ber_len_form_short(*buf) ) { clen = ber_len_short(*buf); buf++; }else{ uint32_t l; l = ber_len_short(*buf); if ( l > 4 || buf + l > end ) return; buf++; for(clen = i = 0; i < l; i++, buf++) { clen <<= 8; clen |= *buf; } } if ( buf + clen > end ) return; printf("%*c.len = %zu (0x%zx)", depth, ' ', len, len); if ( ber_id_octet_constructed(idb) ) { printf(" {\n"); ber_dump(buf, clen, depth + 2); printf("%*c}\n", depth, ' '); }else{ printf("\n"); hex_dump(buf, clen, 16, depth); } buf += clen; goto again; }
static int cldap_parsemsg( LDAP *ld, int msgid, BerElement *ber, LDAPMessage **res, char *base ) { unsigned int tag, len; int rc; size_t baselen, slen; char *dn, *p, *cookie; LDAPMessage *chain, *prev, *ldm; struct berval *bv; rc = LDAP_DECODING_ERROR; /* pessimistic */ ldm = chain = prev = NULLMSG; baselen = ( base == NULL ) ? 0 : strlen( base ); bv = NULL; for ( tag = ber_first_element( ber, &len, &cookie ); tag != LBER_DEFAULT && rc != LDAP_SUCCESS; tag = ber_next_element( ber, &len, cookie )) { if (( ldm = (LDAPMessage *)calloc( 1, sizeof(LDAPMessage))) == NULL || ( ldm->lm_ber = alloc_ber_with_options( ld )) == NULLBER ) { rc = LDAP_NO_MEMORY; break; /* return w/error*/ } ldm->lm_msgid = msgid; ldm->lm_msgtype = tag; if ( tag == LDAP_RES_SEARCH_RESULT ) { Debug( LDAP_DEBUG_TRACE, catgets(slapdcat, 1, 125, "cldap_parsemsg got search result\n"), 0, 0, 0 ); if ( ber_get_stringal( ber, &bv ) == LBER_DEFAULT ) { break; /* return w/error */ } if ( ber_printf( ldm->lm_ber, "to", tag, bv->bv_val, bv->bv_len ) == -1 ) { break; /* return w/error */ } ber_bvfree( bv ); bv = NULL; rc = LDAP_SUCCESS; } else if ( tag == LDAP_RES_SEARCH_ENTRY ) { if ( ber_scanf( ber, "{aO", &dn, &bv ) == LBER_ERROR ) { break; /* return w/error */ } Debug( LDAP_DEBUG_TRACE, catgets(slapdcat, 1, 126, "cldap_parsemsg entry %s\n"), dn, 0, 0 ); if ( dn != NULL && *(dn + ( slen = strlen(dn)) - 1) == '*' && baselen > 0 ) { /* * substitute original searchbase for trailing '*' */ if (( p = (char *)malloc( slen + baselen )) == NULL ) { rc = LDAP_NO_MEMORY; free( dn ); break; /* return w/error */ } strcpy( p, dn ); strcpy( p + slen - 1, base ); free( dn ); dn = p; } if ( ber_printf( ldm->lm_ber, "t{so}", tag, dn, bv->bv_val, bv->bv_len ) == -1 ) { break; /* return w/error */ } free( dn ); ber_bvfree( bv ); bv = NULL; } else { Debug( LDAP_DEBUG_TRACE, catgets(slapdcat, 1, 127, "cldap_parsemsg got unknown tag %d\n"), tag, 0, 0 ); rc = LDAP_PROTOCOL_ERROR; break; /* return w/error */ } /* Reset message ber so we can read from it later. Gack! */ ldm->lm_ber->ber_end = ldm->lm_ber->ber_ptr; ldm->lm_ber->ber_ptr = ldm->lm_ber->ber_buf; #ifdef LDAP_DEBUG if ( ldap_debug & LDAP_DEBUG_PACKETS ) { fprintf( stderr, "cldap_parsemsg add message id %d type %d:\n", ldm->lm_msgid, ldm->lm_msgtype ); ber_dump( ldm->lm_ber, 1 ); } #endif /* LDAP_DEBUG */ #ifndef NO_CACHE if ( ld->ld_cache != NULL ) { add_result_to_cache( ld, ldm ); } #endif /* NO_CACHE */ if ( chain == NULL ) { chain = ldm; } else { prev->lm_chain = ldm; } prev = ldm; ldm = NULL; } /* dispose of any leftovers */ if ( ldm != NULL ) { if ( ldm->lm_ber != NULLBER ) { ber_free( ldm->lm_ber, 1 ); } free( ldm ); } if ( bv != NULL ) { ber_bvfree( bv ); } /* return chain, calling result2error if we got anything at all */ *res = chain; return(( *res == NULLMSG ) ? rc : ldap_result2error( ld, *res, 0 )); }