2 * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
3 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
10 #include <ac/socket.h>
12 #include "back-bdb2.h"
13 #include "proto-back-bdb2.h"
15 static char* get_alias_dn(
20 static char* new_superior(
25 static int dnlist_subordinate(
37 struct ldbminfo *li = (struct ldbminfo *) be->be_private;
43 assert( ( alias != NULL && dn == NULL ) || ( alias == NULL && dn != NULL ) );
51 entry = bdb2i_dn2entry_r( be, dn, &sup );
54 dn = ch_strdup( alias->e_ndn );
60 charray_add( &dnlist, dn );
62 for( depth=0 ; ; depth++ ) {
67 /* have entry, may be an alias */
69 if( !is_entry_alias( entry ) ) {
70 /* entry is not an alias */
75 if( depth > be->be_max_deref_depth ) {
78 *err = LDAP_ALIAS_DEREF_PROBLEM;
79 *text = "maximum deref depth exceeded";
84 aliasDN = get_alias_dn( entry, err, text );
86 if( aliasDN == NULL ) {
92 /* check if aliasDN is a subordinate of any DN in our list */
93 if( dnlist_subordinate( dnlist, aliasDN ) ) {
96 *err = LDAP_ALIAS_PROBLEM;
97 *text = "circular alias";
101 /* attempt to dereference alias */
103 newe = bdb2i_dn2entry_r( be, aliasDN, &sup );
107 bdb2i_cache_return_entry_r(&li->li_cache, entry );
109 dn = ch_strdup( entry->e_ndn );
110 charray_add( &dnlist, dn );
116 bdb2i_cache_return_entry_r(&li->li_cache, entry );
121 /* no newe and no superior, we're done */
124 } else if( sup != NULL ) {
125 /* have superior, may be an alias */
131 if( !is_entry_alias( sup ) ) {
132 /* entry is not an alias */
139 if( depth > be->be_max_deref_depth ) {
142 *err = LDAP_ALIAS_DEREF_PROBLEM;
143 *text = "maximum deref depth exceeded";
148 supDN = get_alias_dn( sup, err, text );
150 if( supDN == NULL ) {
155 aliasDN = new_superior( dn, sup->e_ndn, supDN );
157 if( aliasDN == NULL ) {
160 *err = LDAP_ALIAS_PROBLEM;
161 *text = "superior alias problem";
165 /* check if aliasDN is a subordinate of any DN in our list */
166 if( dnlist_subordinate( dnlist, aliasDN ) ) {
170 *err = LDAP_ALIAS_PROBLEM;
171 *text = "subordinate circular alias";
175 /* attempt to dereference alias */
176 newe = bdb2i_dn2entry_r( be, aliasDN, &newSup );
181 bdb2i_cache_return_entry_r(&li->li_cache, sup );
183 dn = ch_strdup( entry->e_ndn );
184 charray_add( &dnlist, dn );
189 if ( newSup != NULL ) {
191 bdb2i_cache_return_entry_r(&li->li_cache, sup );
200 /* no newe and no superior, we're done */
210 static char* get_alias_dn(
215 Attribute *a = attr_find( e->e_attrs, "aliasedobjectname" );
219 * there was an aliasedobjectname defined but no data.
221 *err = LDAP_ALIAS_PROBLEM;
222 *errmsg = "alias missing aliasedObjectName attribute";
227 * aliasedObjectName should be SINGLE-VALUED with a single value.
229 if ( a->a_vals[0] == NULL || a->a_vals[0]->bv_val == NULL ) {
231 * there was an aliasedobjectname defined but no data.
233 *err = LDAP_ALIAS_PROBLEM;
234 *errmsg = "alias missing aliasedObjectName value";
238 if( a->a_vals[1] != NULL ) {
239 *err = LDAP_ALIAS_PROBLEM;
240 *errmsg = "alias has multivalued aliasedObjectName";
244 return a->a_vals[0]->bv_val;
247 static char* new_superior(
253 size_t dnlen, olen, nlen;
254 assert( dn && oldSup && newSup );
256 dnlen = strlen( dn );
257 olen = strlen( oldSup );
258 nlen = strlen( newSup );
260 newDN = ch_malloc( dnlen - olen + nlen + 1 );
262 memcpy( newDN, dn, dnlen - olen );
263 memcpy( &newDN[dnlen - olen], newSup, nlen );
264 newDN[dnlen - olen + nlen] = '\0';
269 static int dnlist_subordinate(
276 for( i = 0; dnlist[i] != NULL; i++ ) {
277 if( dn_issuffix( dnlist[i], dn ) ) {