]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/overlays/rwmconf.c
ITS#3773 additional fix
[openldap] / servers / slapd / overlays / rwmconf.c
index d664b4a9520dc742cd00ee1710118a8e918decef..32212d6c6dda5af33f082e3aba9705efd98f4883 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1999-2004 The OpenLDAP Foundation.
+ * Copyright 1999-2005 The OpenLDAP Foundation.
  * Portions Copyright 1999-2003 Howard Chu.
  * Portions Copyright 2000-2003 Pierangelo Masarati.
  * All rights reserved.
@@ -142,10 +142,19 @@ rwm_map_config(
        "is not defined in schema\n",
                                fname, lineno, dst );
 
+                       mapping[0].m_dst_oc = oc_bvfind_undef( &mapping[0].m_dst );
+                       if ( mapping[0].m_dst_oc == NULL ) {
+                               fprintf( stderr, "%s: line %d: unable to mimic destination objectClass '%s'\n",
+                                       fname, lineno, dst );
+                               return 1;
+                       }
+
+#if 0
                        mapping[0].m_dst_oc = ch_malloc( sizeof( ObjectClass ) );
                        memset( mapping[0].m_dst_oc, 0, sizeof( ObjectClass ) );
                        mapping[0].m_dst_oc->soc_cname = mapping[0].m_dst;
                        mapping[0].m_flags |= RWMMAP_F_FREE_DST;
+#endif
                }
                mapping[1].m_src_oc = mapping[0].m_dst_oc;
 
@@ -172,10 +181,15 @@ rwm_map_config(
                                 * and add it here.
                                 */
 
-                               mapping[0].m_src_ad = ch_malloc( sizeof( AttributeDescription ) );
-                               memset( mapping[0].m_src_ad, 0, sizeof( AttributeDescription ) );
-                               mapping[0].m_src_ad->ad_cname = mapping[0].m_src;
-                               mapping[1].m_flags |= RWMMAP_F_FREE_SRC;
+                               rc = slap_bv2undef_ad( &mapping[0].m_src,
+                                               &mapping[0].m_src_ad, &text );
+                               if ( rc != LDAP_SUCCESS ) {
+                                       fprintf( stderr,
+       "%s: line %d: source attributeType '%s': %d (%s)\n",
+                                               fname, lineno, src, rc, text ? text : "null" );
+                                       return 1;
+                               }
+
                        }
                        mapping[1].m_dst_ad = mapping[0].m_src_ad;
                }
@@ -187,19 +201,23 @@ rwm_map_config(
        "is not defined in schema\n",
                                fname, lineno, dst );
 
-                       mapping[0].m_dst_ad = ch_malloc( sizeof( AttributeDescription ) );
-                       memset( mapping[0].m_dst_ad, 0, sizeof( AttributeDescription ) );
-                       mapping[0].m_dst_ad->ad_cname = mapping[0].m_dst;
-                       mapping[1].m_flags |= RWMMAP_F_FREE_SRC;
+                       rc = slap_bv2undef_ad( &mapping[0].m_dst,
+                                       &mapping[0].m_dst_ad, &text );
+                       if ( rc != LDAP_SUCCESS ) {
+                               fprintf( stderr,
+       "%s: line %d: destination attributeType '%s': %d (%s)\n",
+                                       fname, lineno, src, rc, text ? text : "null" );
+                               return 1;
+                       }
                }
                mapping[1].m_src_ad = mapping[0].m_dst_ad;
        }
 
-       if ( (src[0] != '\0' && avl_find( map->map, (caddr_t)mapping, rwm_mapping_cmp ) != NULL)
+       if ( ( src[0] != '\0' && avl_find( map->map, (caddr_t)mapping, rwm_mapping_cmp ) != NULL)
                        || avl_find( map->remap, (caddr_t)&mapping[1], rwm_mapping_cmp ) != NULL)
        {
                fprintf( stderr,
-                       "%s: line %d: duplicate mapping found (ignored)\n",
+                       "%s: line %d: duplicate mapping found" SLAPD_CONF_UNKNOWN_IGNORED ".\n",
                        fname, lineno );
                /* FIXME: free stuff */
                goto error_return;
@@ -216,7 +234,7 @@ rwm_map_config(
 
 error_return:;
        if ( mapping ) {
-               mapping_free( mapping );
+               rwm_mapping_free( mapping );
        }
 
        return 1;
@@ -235,9 +253,12 @@ rwm_suffix_massage_regexize( const char *s )
                        p = r + 1, i++ )
                ;
 
-       res = ch_calloc( sizeof( char ), strlen( s ) + 4 + 4*i + 1 );
+       res = ch_calloc( sizeof( char ), strlen( s )
+                       + STRLENOF( "((.+),)?" )
+                       + STRLENOF( "[ ]?" ) * i
+                       + STRLENOF( "$" ) + 1 );
 
-       ptr = lutil_strcopy( res, "(.*)" );
+       ptr = lutil_strcopy( res, "((.+),)?" );
        for ( i = 0, p = s;
                        ( r = strchr( p, ',' ) ) != NULL;
                        p = r + 1 , i++ ) {
@@ -248,7 +269,9 @@ rwm_suffix_massage_regexize( const char *s )
                        r++;
                }
        }
-       lutil_strcopy( ptr, p );
+       ptr = lutil_strcopy( ptr, p );
+       ptr[0] = '$';
+       ptr[1] = '\0';
 
        return res;
 }
@@ -261,13 +284,13 @@ rwm_suffix_massage_patternize( const char *s )
 
        len = strlen( s );
 
-       res = ch_calloc( sizeof( char ), len + sizeof( "%1" ) );
+       res = ch_calloc( sizeof( char ), len + STRLENOF( "%1" ) + 1 );
        if ( res == NULL ) {
                return NULL;
        }
 
        strcpy( res, "%1" );
-       strcpy( res + sizeof( "%1" ) - 1, s );
+       strcpy( res + STRLENOF( "%1" ), s );
 
        return res;
 }
@@ -304,7 +327,7 @@ rwm_suffix_massage_config(
        ch_free( rargv[ 2 ] );
        
        rargv[ 0 ] = "rewriteContext";
-       rargv[ 1 ] = "searchResultDN";
+       rargv[ 1 ] = "searchEntryDN";
        rargv[ 2 ] = NULL;
        rewrite_parse( info, "<suffix massage>", ++line, 2, rargv );
        
@@ -320,14 +343,34 @@ rwm_suffix_massage_config(
        rargv[ 0 ] = "rewriteContext";
        rargv[ 1 ] = "matchedDN";
        rargv[ 2 ] = "alias";
-       rargv[ 3 ] = "searchResultDN";
+       rargv[ 3 ] = "searchEntryDN";
+       rargv[ 4 ] = NULL;
+       rewrite_parse( info, "<suffix massage>", ++line, 4, rargv );
+
+#ifdef RWM_REFERRAL_REWRITE
+       /* FIXME: we don't want this on by default, do we? */
+       rargv[ 0 ] = "rewriteContext";
+       rargv[ 1 ] = "referralDN";
+       rargv[ 2 ] = "alias";
+       rargv[ 3 ] = "searchEntryDN";
        rargv[ 4 ] = NULL;
        rewrite_parse( info, "<suffix massage>", ++line, 4, rargv );
+#else /* ! RWM_REFERRAL_REWRITE */
+       rargv[ 0 ] = "rewriteContext";
+       rargv[ 1 ] = "referralAttrDN";
+       rargv[ 2 ] = NULL;
+       rewrite_parse( info, "<suffix massage>", ++line, 2, rargv );
+
+       rargv[ 0 ] = "rewriteContext";
+       rargv[ 1 ] = "referralDN";
+       rargv[ 2 ] = NULL;
+       rewrite_parse( info, "<suffix massage>", ++line, 2, rargv );
+#endif /* ! RWM_REFERRAL_REWRITE */
 
        rargv[ 0 ] = "rewriteContext";
        rargv[ 1 ] = "searchAttrDN";
        rargv[ 2 ] = "alias";
-       rargv[ 3 ] = "searchResultDN";
+       rargv[ 3 ] = "searchEntryDN";
        rargv[ 4 ] = NULL;
        rewrite_parse( info, "<suffix massage>", ++line, 4, rargv );