1
1
/* dynlist.c - dynamic list overlay */
2
/* $OpenLDAP: pkg/ldap/servers/slapd/overlays/dynlist.c,v 1.20.2.17 2008/07/10 00:43:03 quanah Exp $ */
2
/* $OpenLDAP: pkg/ldap/servers/slapd/overlays/dynlist.c,v 1.20.2.25 2009/01/30 19:10:13 quanah Exp $ */
3
3
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
5
* Copyright 2003-2008 The OpenLDAP Foundation.
5
* Copyright 2003-2009 The OpenLDAP Foundation.
6
6
* Portions Copyright 2004-2005 Pierangelo Masarati.
7
7
* Portions Copyright 2008 Emmanuel Dreyfus.
8
8
* All rights reserved.
62
62
static AttributeDescription *ad_dgIdentity, *ad_dgAuthz;
64
64
typedef struct dynlist_map_t {
65
AttributeDescription *dlm_member_ad;
66
AttributeDescription *dlm_mapped_ad;
67
struct dynlist_map_t *dlm_next;
65
AttributeDescription *dlm_member_ad;
66
AttributeDescription *dlm_mapped_ad;
67
struct dynlist_map_t *dlm_next;
70
70
typedef struct dynlist_info_t {
71
71
ObjectClass *dli_oc;
72
72
AttributeDescription *dli_ad;
73
73
struct dynlist_map_t *dli_dlm;
74
struct berval dli_uri;
76
struct berval dli_uri_nbase;
77
Filter *dli_uri_filter;
74
78
struct berval dli_default_filter;
75
79
struct dynlist_info_t *dli_next;
78
82
#define DYNLIST_USAGE \
79
"\"dynlist-attrset <oc> <URL-ad> [[<mapped-ad>:]<member-ad> ...]\": "
83
"\"dynlist-attrset <oc> [uri] <URL-ad> [[<mapped-ad>:]<member-ad> ...]\": "
81
85
static dynlist_info_t *
82
86
dynlist_is_dynlist_next( Operation *op, SlapReply *rs, dynlist_info_t *old_dli )
104
108
for ( ; dli; dli = dli->dli_next ) {
109
if ( dli->dli_lud != NULL ) {
110
/* check base and scope */
111
if ( !BER_BVISNULL( &dli->dli_uri_nbase ) ) {
112
int d = rs->sr_entry->e_nname.bv_len - dli->dli_uri_nbase.bv_len;
118
if ( !dnIsSuffix( &rs->sr_entry->e_nname, &dli->dli_uri_nbase ) ) {
122
switch ( dli->dli_lud->lud_scope ) {
123
case LDAP_SCOPE_BASE:
129
case LDAP_SCOPE_ONELEVEL: {
132
dnParent( &rs->sr_entry->e_nname, &pdn );
133
if ( pdn.bv_len != dli->dli_uri_nbase.bv_len ) {
138
case LDAP_SCOPE_SUBORDINATE:
144
case LDAP_SCOPE_SUBTREE:
145
case LDAP_SCOPE_DEFAULT:
154
if ( dli->dli_uri_filter && test_filter( op, rs->sr_entry, dli->dli_uri_filter ) != LDAP_COMPARE_TRUE ) {
105
159
if ( attr_valfind( a,
106
160
SLAP_MR_ATTRIBUTE_VALUE_NORMALIZED_MATCH |
107
161
SLAP_MR_ASSERTED_VALUE_NORMALIZED_MATCH,
498
554
if ( o.ors_attrs[j].an_desc != NULL &&
499
555
is_at_operational( o.ors_attrs[j].an_desc->ad_type ) )
501
if ( !opattrs && !ad_inlist( o.ors_attrs[j].an_desc, rs->sr_attrs ) )
561
if ( !ad_inlist( o.ors_attrs[j].an_desc, rs->sr_attrs ) ) {
562
/* lookup if mapped -- linear search,
563
* not very efficient unless list
565
for ( dlm = dli->dli_dlm; dlm; dlm = dlm->dlm_next ) {
566
if ( dlm->dlm_member_ad == o.ors_attrs[j].an_desc ) {
507
577
if ( !userattrs &&
508
578
o.ors_attrs[j].an_desc != NULL &&
509
579
!ad_inlist( o.ors_attrs[j].an_desc, rs->sr_attrs ) )
581
/* lookup if mapped -- linear search,
582
* not very efficient unless list
584
for ( dlm = dli->dli_dlm; dlm; dlm = dlm->dlm_next ) {
585
if ( dlm->dlm_member_ad == o.ors_attrs[j].an_desc ) {
1118
1201
/* XXXmanu 255 is the maximum arguments we allow. Can we go beyond? */
1119
1202
static ConfigTable dlcfg[] = {
1120
{ "dynlist-attrset", "group-oc> <URL-ad> <member-ad",
1121
3, 255, 0, ARG_MAGIC|DL_ATTRSET, dl_cfgen,
1122
"( OLcfgOvAt:8.1 NAME 'olcDLattrSet' "
1203
{ "dynlist-attrset", "group-oc> [uri] <URL-ad> <[mapped:]member-ad> [...]",
1204
3, 0, 0, ARG_MAGIC|DL_ATTRSET, dl_cfgen,
1205
"( OLcfgOvAt:8.1 NAME 'olcDlAttrSet' "
1123
1206
"DESC 'Dynamic list: <group objectClass>, <URL attributeDescription>, <member attributeDescription>' "
1124
1207
"EQUALITY caseIgnoreMatch "
1125
1208
"SYNTAX OMsDirectoryString "
1165
1248
assert( dli->dli_oc != NULL );
1166
1249
assert( dli->dli_ad != NULL );
1251
/* FIXME: check buffer overflow! */
1168
1252
ptr += snprintf( c->cr_msg, sizeof( c->cr_msg ),
1169
SLAP_X_ORDERED_FMT "%s %s", i,
1170
dli->dli_oc->soc_cname.bv_val,
1171
dli->dli_ad->ad_cname.bv_val );
1253
SLAP_X_ORDERED_FMT "%s", i,
1254
dli->dli_oc->soc_cname.bv_val );
1256
if ( !BER_BVISNULL( &dli->dli_uri ) ) {
1259
ptr = lutil_strncopy( ptr, dli->dli_uri.bv_val,
1260
dli->dli_uri.bv_len );
1265
ptr = lutil_strncopy( ptr, dli->dli_oc->soc_cname.bv_val,
1266
dli->dli_oc->soc_cname.bv_len );
1173
1268
for ( dlm = dli->dli_dlm; dlm; dlm = dlm->dlm_next ) {
1174
1269
ptr[ 0 ] = ' ';
1213
1308
dli_next = dli->dli_next;
1310
if ( !BER_BVISNULL( &dli->dli_uri ) ) {
1311
ch_free( dli->dli_uri.bv_val );
1314
if ( dli->dli_lud != NULL ) {
1315
ldap_free_urldesc( dli->dli_lud );
1318
if ( !BER_BVISNULL( &dli->dli_uri_nbase ) ) {
1319
ber_memfree( dli->dli_uri_nbase.bv_val );
1322
if ( dli->dli_uri_filter != NULL ) {
1323
filter_free( dli->dli_uri_filter );
1215
1326
ch_free( dli->dli_default_filter.bv_val );
1217
1328
while ( dlm != NULL ) {
1242
1353
*dlip = dli->dli_next;
1355
if ( !BER_BVISNULL( &dli->dli_uri ) ) {
1356
ch_free( dli->dli_uri.bv_val );
1359
if ( dli->dli_lud != NULL ) {
1360
ldap_free_urldesc( dli->dli_lud );
1363
if ( !BER_BVISNULL( &dli->dli_uri_nbase ) ) {
1364
ber_memfree( dli->dli_uri_nbase.bv_val );
1367
if ( dli->dli_uri_filter != NULL ) {
1368
filter_free( dli->dli_uri_filter );
1243
1371
ch_free( dli->dli_default_filter.bv_val );
1245
1373
dlm = dli->dli_dlm;
1289
rc = slap_str2ad( c->argv[ 2 ], &ad, &text );
1422
if ( strncasecmp( c->argv[ attridx ], "ldap://", STRLENOF("ldap://") ) == 0 ) {
1423
if ( ldap_url_parse( c->argv[ attridx ], &lud ) != LDAP_URL_SUCCESS ) {
1424
snprintf( c->cr_msg, sizeof( c->cr_msg ), DYNLIST_USAGE
1425
"unable to parse URI \"%s\"",
1426
c->argv[ attridx ] );
1431
if ( lud->lud_host != NULL ) {
1432
if ( lud->lud_host[0] == '\0' ) {
1433
ch_free( lud->lud_host );
1434
lud->lud_host = NULL;
1437
snprintf( c->cr_msg, sizeof( c->cr_msg ), DYNLIST_USAGE
1438
"host not allowed in URI \"%s\"",
1439
c->argv[ attridx ] );
1445
if ( lud->lud_attrs != NULL ) {
1446
snprintf( c->cr_msg, sizeof( c->cr_msg ), DYNLIST_USAGE
1447
"attrs not allowed in URI \"%s\"",
1448
c->argv[ attridx ] );
1453
if ( lud->lud_exts != NULL ) {
1454
snprintf( c->cr_msg, sizeof( c->cr_msg ), DYNLIST_USAGE
1455
"extensions not allowed in URI \"%s\"",
1456
c->argv[ attridx ] );
1461
if ( lud->lud_dn != NULL && lud->lud_dn[ 0 ] != '\0' ) {
1463
ber_str2bv( lud->lud_dn, 0, 0, &dn );
1464
rc = dnNormalize( 0, NULL, NULL, &dn, &nbase, NULL );
1465
if ( rc != LDAP_SUCCESS ) {
1466
snprintf( c->cr_msg, sizeof( c->cr_msg ), DYNLIST_USAGE
1467
"DN normalization failed in URI \"%s\"",
1468
c->argv[ attridx ] );
1473
if ( lud->lud_filter != NULL && lud->lud_filter[ 0 ] != '\0' ) {
1474
filter = str2filter( lud->lud_filter );
1475
if ( filter == NULL ) {
1476
snprintf( c->cr_msg, sizeof( c->cr_msg ), DYNLIST_USAGE
1477
"filter parsing failed in URI \"%s\"",
1478
c->argv[ attridx ] );
1484
ber_str2bv( c->argv[ attridx ], 0, 1, &uri );
1489
ldap_free_urldesc( lud );
1492
if ( !BER_BVISNULL( &nbase ) ) {
1493
ber_memfree( nbase.bv_val );
1496
if ( filter != NULL ) {
1497
filter_free( filter );
1500
Debug( LDAP_DEBUG_ANY, "%s: %s.\n",
1501
c->log, c->cr_msg, 0 );
1509
rc = slap_str2ad( c->argv[ attridx ], &ad, &text );
1290
1510
if ( rc != LDAP_SUCCESS ) {
1291
1511
snprintf( c->cr_msg, sizeof( c->cr_msg ), DYNLIST_USAGE
1292
1512
"unable to find AttributeDescription \"%s\"",
1513
c->argv[ attridx ] );
1294
1514
Debug( LDAP_DEBUG_ANY, "%s: %s.\n",
1295
1515
c->log, c->cr_msg, 0 );
1300
1520
snprintf( c->cr_msg, sizeof( c->cr_msg ), DYNLIST_USAGE
1301
1521
"AttributeDescription \"%s\" "
1302
1522
"must be a subtype of \"labeledURI\"",
1523
c->argv[ attridx ] );
1304
1524
Debug( LDAP_DEBUG_ANY, "%s: %s.\n",
1305
1525
c->log, c->cr_msg, 0 );
1309
for ( i = 3; i < c->argc; i++ ) {
1531
for ( i = attridx; i < c->argc; i++ ) {
1312
1534
AttributeDescription *member_ad = NULL;
1600
1827
dli_next = dli->dli_next;
1829
if ( !BER_BVISNULL( &dli->dli_uri ) ) {
1830
ch_free( dli->dli_uri.bv_val );
1833
if ( dli->dli_lud != NULL ) {
1834
ldap_free_urldesc( dli->dli_lud );
1837
if ( !BER_BVISNULL( &dli->dli_uri_nbase ) ) {
1838
ber_memfree( dli->dli_uri_nbase.bv_val );
1841
if ( dli->dli_uri_filter != NULL ) {
1842
filter_free( dli->dli_uri_filter );
1602
1845
ch_free( dli->dli_default_filter.bv_val );
1603
1847
dlm = dli->dli_dlm;
1604
1848
while ( dlm != NULL ) {
1605
1849
dlm_next = dlm->dlm_next;