1
1
/* bind.c - ldap backend bind function */
2
/* $OpenLDAP: pkg/ldap/servers/slapd/back-ldap/bind.c,v 1.162.2.22 2009/06/11 21:48:11 quanah Exp $ */
2
/* $OpenLDAP: pkg/ldap/servers/slapd/back-ldap/bind.c,v 1.162.2.24 2009/09/01 22:50:21 quanah Exp $ */
3
3
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
5
5
* Copyright 1999-2009 The OpenLDAP Foundation.
40
41
#define LDAP_CONTROL_OBSOLETE_PROXY_AUTHZ "2.16.840.1.113730.3.4.12"
42
43
#if LDAP_BACK_PRINT_CONNTREE > 0
49
{ LDAP_BACK_FCONN_ISBOUND, 'B' },
50
{ LDAP_BACK_FCONN_ISANON, 'A' },
51
{ LDAP_BACK_FCONN_ISPRIV, 'P' },
52
{ LDAP_BACK_FCONN_ISTLS, 'T' },
53
{ LDAP_BACK_FCONN_BINDING, 'X' },
54
{ LDAP_BACK_FCONN_TAINTED, 'E' },
55
{ LDAP_BACK_FCONN_ABANDON, 'N' },
56
{ LDAP_BACK_FCONN_ISIDASR, 'S' },
57
{ LDAP_BACK_FCONN_CACHED, 'C' },
62
ldap_back_conn_print( ldapconn_t *lc, const char *avlstr )
64
char buf[ SLAP_TEXT_BUFLEN ];
65
char fbuf[ sizeof("BAPTIENSC") ];
68
ldap_back_conn2str( &lc->lc_base, buf, sizeof( buf ) );
69
for ( i = 0; flagsmap[ i ].c != '\0'; i++ ) {
70
if ( lc->lc_lcflags & flagsmap[i].f ) {
71
fbuf[i] = flagsmap[i].c;
79
fprintf( stderr, "lc=%p %s %s flags=0x%08x (%s)\n",
80
(void *)lc, buf, avlstr, lc->lc_lcflags, fbuf );
44
84
ldap_back_ravl_print( Avlnode *root, int depth )
59
99
lc = root->avl_data;
60
fprintf( stderr, "lc=%p local=\"%s\" conn=%p %s refcnt=%d flags=0x%08x\n",
62
lc->lc_local_ndn.bv_val ? lc->lc_local_ndn.bv_val : "",
64
avl_bf2str( root->avl_bf ), lc->lc_refcnt, lc->lc_lcflags );
66
ldap_back_ravl_print( root->avl_left, depth+1 );
100
ldap_back_conn_print( lc, avl_bf2str( root->avl_bf ) );
102
ldap_back_ravl_print( root->avl_left, depth + 1 );
69
105
static char* priv2str[] = {
92
128
LDAP_TAILQ_FOREACH( lc, &li->li_conn_priv[ c ].lic_priv, lc_q )
94
fprintf( stderr, " [%d] lc=%p local=\"%s\" conn=%p refcnt=%d flags=0x%08x\n",
97
lc->lc_local_ndn.bv_val ? lc->lc_local_ndn.bv_val : "",
98
(void *)lc->lc_conn, lc->lc_refcnt, lc->lc_lcflags );
130
fprintf( stderr, " [%d] ", i );
131
ldap_back_conn_print( lc, "" );
303
336
if ( LDAP_BACK_SINGLECONN( li ) ) {
304
337
while ( ( tmplc = avl_delete( &li->li_conninfo.lai_tree, (caddr_t)lc, ldap_back_conn_cmp ) ) != NULL )
339
assert( !LDAP_BACK_PCONN_ISPRIV( lc ) );
306
340
Debug( LDAP_DEBUG_TRACE,
307
"=>ldap_back_bind: destroying conn %ld (refcnt=%u)\n",
308
LDAP_BACK_PCONN_ID( lc ), lc->lc_refcnt, 0 );
341
"=>ldap_back_bind: destroying conn %lu (refcnt=%u)\n",
342
lc->lc_conn->c_connid, lc->lc_refcnt, 0 );
310
344
if ( tmplc->lc_refcnt != 0 ) {
2753
ldap_back_conn2str( const ldapconn_base_t *lc, char *buf, ber_len_t buflen )
2755
char tbuf[ SLAP_TEXT_BUFLEN ];
2756
char *ptr = buf, *end = buf + buflen;
2759
if ( ptr + sizeof("conn=") > end ) return -1;
2760
ptr = lutil_strcopy( ptr, "conn=" );
2762
len = ldap_back_connid2str( lc, ptr, (ber_len_t)(end - ptr) );
2764
if ( ptr >= end ) return -1;
2766
if ( !BER_BVISNULL( &lc->lcb_local_ndn ) ) {
2767
if ( ptr + sizeof(" DN=\"\"") + lc->lcb_local_ndn.bv_len > end ) return -1;
2768
ptr = lutil_strcopy( ptr, " DN=\"" );
2769
ptr = lutil_strncopy( ptr, lc->lcb_local_ndn.bv_val, lc->lcb_local_ndn.bv_len );
2773
if ( lc->lcb_create_time != 0 ) {
2774
len = snprintf( tbuf, sizeof(tbuf), "%ld", lc->lcb_create_time );
2775
if ( ptr + sizeof(" created=") + len >= end ) return -1;
2776
ptr = lutil_strcopy( ptr, " created=" );
2777
ptr = lutil_strcopy( ptr, tbuf );
2780
if ( lc->lcb_time != 0 ) {
2781
len = snprintf( tbuf, sizeof(tbuf), "%ld", lc->lcb_time );
2782
if ( ptr + sizeof(" modified=") + len >= end ) return -1;
2783
ptr = lutil_strcopy( ptr, " modified=" );
2784
ptr = lutil_strcopy( ptr, tbuf );
2787
len = snprintf( tbuf, sizeof(tbuf), "%u", lc->lcb_refcnt );
2788
if ( ptr + sizeof(" refcnt=") + len >= end ) return -1;
2789
ptr = lutil_strcopy( ptr, " refcnt=" );
2790
ptr = lutil_strcopy( ptr, tbuf );
2796
ldap_back_connid2str( const ldapconn_base_t *lc, char *buf, ber_len_t buflen )
2798
static struct berval conns[] = {
2800
BER_BVC("ROOTDN-TLS"),
2802
BER_BVC("ANON-TLS"),
2804
BER_BVC("BIND-TLS"),
2810
if ( LDAP_BACK_PCONN_ISPRIV( (const ldapconn_t *)lc ) ) {
2814
cid = (long)lc->lcb_conn;
2815
assert( cid >= LDAP_BACK_PCONN_FIRST && cid < LDAP_BACK_PCONN_LAST );
2819
if ( bv->bv_len >= buflen ) {
2820
return bv->bv_len + 1;
2824
lutil_strncopy( buf, bv->bv_val, bv->bv_len + 1 );
2827
len = snprintf( buf, buflen, "%lu", lc->lcb_conn->c_connid );