void rwm_mapping_dst_free( void *v_mapping ) { struct ldapmapping *mapping = v_mapping; if ( BER_BVISEMPTY( &mapping[0].m_dst ) ) { rwm_mapping_free( &mapping[ -1 ] ); } }
int rwm_map_config( struct ldapmap *oc_map, struct ldapmap *at_map, const char *fname, int lineno, int argc, char **argv ) { struct ldapmap *map; struct ldapmapping *mapping; char *src, *dst; int is_oc = 0; int rc = 0; if ( argc < 3 || argc > 4 ) { Debug( LDAP_DEBUG_ANY, "%s: line %d: syntax is \"map {objectclass | attribute} [<local> | *] {<foreign> | *}\"\n", fname, lineno, 0 ); return 1; } if ( strcasecmp( argv[1], "objectclass" ) == 0 ) { map = oc_map; is_oc = 1; } else if ( strcasecmp( argv[1], "attribute" ) == 0 ) { map = at_map; } else { Debug( LDAP_DEBUG_ANY, "%s: line %d: syntax is " "\"map {objectclass | attribute} [<local> | *] " "{<foreign> | *}\"\n", fname, lineno, 0 ); return 1; } if ( !is_oc && map->map == NULL ) { /* only init if required */ if ( rwm_map_init( map, &mapping ) != LDAP_SUCCESS ) { return 1; } } if ( strcmp( argv[2], "*" ) == 0 ) { if ( argc < 4 || strcmp( argv[3], "*" ) == 0 ) { map->drop_missing = ( argc < 4 ); goto success_return; } src = dst = argv[3]; } else if ( argc < 4 ) { src = ""; dst = argv[2]; } else { src = argv[2]; dst = ( strcmp( argv[3], "*" ) == 0 ? src : argv[3] ); } if ( ( map == at_map ) && ( strcasecmp( src, "objectclass" ) == 0 || strcasecmp( dst, "objectclass" ) == 0 ) ) { Debug( LDAP_DEBUG_ANY, "%s: line %d: objectclass attribute cannot be mapped\n", fname, lineno, 0 ); return 1; } mapping = (struct ldapmapping *)ch_calloc( 2, sizeof(struct ldapmapping) ); if ( mapping == NULL ) { Debug( LDAP_DEBUG_ANY, "%s: line %d: out of memory\n", fname, lineno, 0 ); return 1; } ber_str2bv( src, 0, 1, &mapping[0].m_src ); ber_str2bv( dst, 0, 1, &mapping[0].m_dst ); mapping[1].m_src = mapping[0].m_dst; mapping[1].m_dst = mapping[0].m_src; mapping[0].m_flags = RWMMAP_F_NONE; mapping[1].m_flags = RWMMAP_F_NONE; /* * schema check */ if ( is_oc ) { if ( src[0] != '\0' ) { mapping[0].m_src_oc = oc_bvfind( &mapping[0].m_src ); if ( mapping[0].m_src_oc == NULL ) { Debug( LDAP_DEBUG_ANY, "%s: line %d: warning, source objectClass '%s' " "should be defined in schema\n", fname, lineno, src ); /* * FIXME: this should become an err */ mapping[0].m_src_oc = ch_malloc( sizeof( ObjectClass ) ); memset( mapping[0].m_src_oc, 0, sizeof( ObjectClass ) ); mapping[0].m_src_oc->soc_cname = mapping[0].m_src; mapping[0].m_flags |= RWMMAP_F_FREE_SRC; } mapping[1].m_dst_oc = mapping[0].m_src_oc; } mapping[0].m_dst_oc = oc_bvfind( &mapping[0].m_dst ); if ( mapping[0].m_dst_oc == NULL ) { Debug( LDAP_DEBUG_ANY, "%s: line %d: warning, destination objectClass '%s' " "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 ) { Debug( LDAP_DEBUG_ANY, "%s: line %d: unable to mimic destination objectClass '%s'\n", fname, lineno, dst ); goto error_return; } } mapping[1].m_src_oc = mapping[0].m_dst_oc; mapping[0].m_flags |= RWMMAP_F_IS_OC; mapping[1].m_flags |= RWMMAP_F_IS_OC; } else { int rc; const char *text = NULL; if ( src[0] != '\0' ) { rc = slap_bv2ad( &mapping[0].m_src, &mapping[0].m_src_ad, &text ); if ( rc != LDAP_SUCCESS ) { Debug( LDAP_DEBUG_ANY, "%s: line %d: warning, source attributeType '%s' " "should be defined in schema\n", fname, lineno, src ); /* * we create a fake "proxied" ad * and add it here. */ rc = slap_bv2undef_ad( &mapping[0].m_src, &mapping[0].m_src_ad, &text, SLAP_AD_PROXIED ); if ( rc != LDAP_SUCCESS ) { char prefix[1024]; snprintf( prefix, sizeof(prefix), "%s: line %d: source attributeType '%s': %d", fname, lineno, src, rc ); Debug( LDAP_DEBUG_ANY, "%s (%s)\n", prefix, text ? text : "null", 0 ); goto error_return; } } mapping[1].m_dst_ad = mapping[0].m_src_ad; } rc = slap_bv2ad( &mapping[0].m_dst, &mapping[0].m_dst_ad, &text ); if ( rc != LDAP_SUCCESS ) { Debug( LDAP_DEBUG_ANY, "%s: line %d: warning, destination attributeType '%s' " "is not defined in schema\n", fname, lineno, dst ); rc = slap_bv2undef_ad( &mapping[0].m_dst, &mapping[0].m_dst_ad, &text, SLAP_AD_PROXIED ); if ( rc != LDAP_SUCCESS ) { char prefix[1024]; snprintf( prefix, sizeof(prefix), "%s: line %d: destination attributeType '%s': %d", fname, lineno, dst, rc ); Debug( LDAP_DEBUG_ANY, "%s (%s)\n", prefix, text ? text : "null", 0 ); goto error_return; } } 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) || avl_find( map->remap, (caddr_t)&mapping[1], rwm_mapping_cmp ) != NULL) { Debug( LDAP_DEBUG_ANY, "%s: line %d: duplicate mapping found.\n", fname, lineno, 0 ); /* FIXME: free stuff */ goto error_return; } if ( src[0] != '\0' ) { avl_insert( &map->map, (caddr_t)&mapping[0], rwm_mapping_cmp, rwm_mapping_dup ); } avl_insert( &map->remap, (caddr_t)&mapping[1], rwm_mapping_cmp, rwm_mapping_dup ); success_return:; return rc; error_return:; if ( mapping ) { rwm_mapping_free( mapping ); } return 1; }