1 /* $NetBSD: dntest.c,v 1.1.1.3 2010/12/12 15:21:30 adam Exp $ */ 2 3 /* dntest.c -- OpenLDAP DN API Test Program */ 4 /* OpenLDAP: pkg/ldap/libraries/libldap/dntest.c,v 1.27.2.5 2010/04/13 20:22:56 kurt Exp */ 5 /* This work is part of OpenLDAP Software <http://www.openldap.org/>. 6 * 7 * Copyright 1998-2010 The OpenLDAP Foundation. 8 * All rights reserved. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted only as authorized by the OpenLDAP 12 * Public License. 13 * 14 * A copy of this license is available in the file LICENSE in the 15 * top-level directory of the distribution or, alternatively, at 16 * <http://www.OpenLDAP.org/license.html>. 17 */ 18 /* ACKNOWLEDGEMENT: 19 * This program was initially developed by Pierangelo Masarati <ando@OpenLDAP.org> 20 * for inclusion in OpenLDAP Software. 21 */ 22 23 /* 24 * This program is designed to test the ldap_str2dn/ldap_dn2str 25 * functions 26 */ 27 #include "portable.h" 28 29 #include <stdio.h> 30 31 #include <ac/stdlib.h> 32 #include <ac/string.h> 33 #include <ac/unistd.h> 34 35 #include <ldap.h> 36 37 #include "ldap-int.h" 38 39 #include "ldif.h" 40 #include "lutil.h" 41 #include "lutil_ldap.h" 42 #include "ldap_defaults.h" 43 44 int 45 main( int argc, char *argv[] ) 46 { 47 int rc, i, debug = 0, f2 = 0; 48 unsigned flags[ 2 ] = { 0U, 0 }; 49 char *strin, *str = NULL, buf[ 1024 ]; 50 LDAPDN dn, dn2 = NULL; 51 52 while ( 1 ) { 53 int opt = getopt( argc, argv, "d:" ); 54 55 if ( opt == EOF ) { 56 break; 57 } 58 59 switch ( opt ) { 60 case 'd': 61 debug = atoi( optarg ); 62 break; 63 } 64 } 65 66 optind--; 67 argc -= optind; 68 argv += optind; 69 70 if ( argc < 2 ) { 71 fprintf( stderr, "usage: dntest <dn> [flags-in[,...]] [flags-out[,...]]\n\n" ); 72 fprintf( stderr, "\tflags-in: V3,V2,DCE,<flags>\n" ); 73 fprintf( stderr, "\tflags-out: V3,V2,UFN,DCE,AD,<flags>\n\n" ); 74 fprintf( stderr, "\t<flags>: PRETTY,PEDANTIC,NOSPACES,NOONESPACE\n\n" ); 75 return( 0 ); 76 } 77 78 if ( ber_set_option( NULL, LBER_OPT_DEBUG_LEVEL, &debug ) != LBER_OPT_SUCCESS ) { 79 fprintf( stderr, "Could not set LBER_OPT_DEBUG_LEVEL %d\n", debug ); 80 } 81 if ( ldap_set_option( NULL, LDAP_OPT_DEBUG_LEVEL, &debug ) != LDAP_OPT_SUCCESS ) { 82 fprintf( stderr, "Could not set LDAP_OPT_DEBUG_LEVEL %d\n", debug ); 83 } 84 85 if ( strcmp( argv[ 1 ], "-" ) == 0 ) { 86 size_t len; 87 88 fgets( buf, sizeof( buf ), stdin ); 89 len = strlen( buf ); 90 if ( len > 0 && buf[ --len ] == '\n' ) { 91 buf[ len ] = '\0'; 92 } 93 strin = buf; 94 } else { 95 strin = argv[ 1 ]; 96 } 97 98 if ( argc >= 3 ) { 99 for ( i = 0; i < argc - 2; i++ ) { 100 char *s, *e; 101 for ( s = argv[ 2 + i ]; s; s = e ) { 102 e = strchr( s, ',' ); 103 if ( e != NULL ) { 104 e[ 0 ] = '\0'; 105 e++; 106 } 107 108 if ( !strcasecmp( s, "V3" ) ) { 109 flags[ i ] |= LDAP_DN_FORMAT_LDAPV3; 110 } else if ( !strcasecmp( s, "V2" ) ) { 111 flags[ i ] |= LDAP_DN_FORMAT_LDAPV2; 112 } else if ( !strcasecmp( s, "DCE" ) ) { 113 flags[ i ] |= LDAP_DN_FORMAT_DCE; 114 } else if ( !strcasecmp( s, "UFN" ) ) { 115 flags[ i ] |= LDAP_DN_FORMAT_UFN; 116 } else if ( !strcasecmp( s, "AD" ) ) { 117 flags[ i ] |= LDAP_DN_FORMAT_AD_CANONICAL; 118 } else if ( !strcasecmp( s, "PRETTY" ) ) { 119 flags[ i ] |= LDAP_DN_PRETTY; 120 } else if ( !strcasecmp( s, "PEDANTIC" ) ) { 121 flags[ i ] |= LDAP_DN_PEDANTIC; 122 } else if ( !strcasecmp( s, "NOSPACES" ) ) { 123 flags[ i ] |= LDAP_DN_P_NOLEADTRAILSPACES; 124 } else if ( !strcasecmp( s, "NOONESPACE" ) ) { 125 flags[ i ] |= LDAP_DN_P_NOSPACEAFTERRDN; 126 } 127 } 128 } 129 } 130 131 if ( flags[ 1 ] == 0 ) 132 flags[ 1 ] = LDAP_DN_FORMAT_LDAPV3; 133 134 f2 = 1; 135 136 rc = ldap_str2dn( strin, &dn, flags[ 0 ] ); 137 138 if ( rc == LDAP_SUCCESS ) { 139 int i; 140 if ( dn ) { 141 for ( i = 0; dn[ i ]; i++ ) { 142 LDAPRDN rdn = dn[ i ]; 143 char *rstr = NULL; 144 145 if ( ldap_rdn2str( rdn, &rstr, flags[ f2 ] ) ) { 146 fprintf( stdout, "\tldap_rdn2str() failed\n" ); 147 continue; 148 } 149 150 fprintf( stdout, "\tldap_rdn2str() = \"%s\"\n", rstr ); 151 ldap_memfree( rstr ); 152 } 153 } else { 154 fprintf( stdout, "\tempty DN\n" ); 155 } 156 } 157 158 str = NULL; 159 if ( rc == LDAP_SUCCESS && 160 ldap_dn2str( dn, &str, flags[ f2 ] ) == LDAP_SUCCESS ) 161 { 162 char **values, *tmp, *tmp2, *str2 = NULL; 163 int n; 164 165 fprintf( stdout, "\nldap_dn2str(ldap_str2dn(\"%s\"))\n" 166 "\t= \"%s\"\n", strin, str ); 167 168 switch ( flags[ f2 ] & LDAP_DN_FORMAT_MASK ) { 169 case LDAP_DN_FORMAT_UFN: 170 case LDAP_DN_FORMAT_AD_CANONICAL: 171 return( 0 ); 172 173 case LDAP_DN_FORMAT_LDAPV3: 174 case LDAP_DN_FORMAT_LDAPV2: 175 n = ldap_dn2domain( strin, &tmp ); 176 if ( n ) { 177 fprintf( stdout, "\nldap_dn2domain(\"%s\") FAILED\n", strin ); 178 } else { 179 fprintf( stdout, "\nldap_dn2domain(\"%s\")\n" 180 "\t= \"%s\"\n", strin, tmp ? tmp : "" ); 181 } 182 ldap_memfree( tmp ); 183 184 tmp = ldap_dn2ufn( strin ); 185 fprintf( stdout, "\nldap_dn2ufn(\"%s\")\n" 186 "\t= \"%s\"\n", strin, tmp ? tmp : "" ); 187 ldap_memfree( tmp ); 188 189 tmp = ldap_dn2dcedn( strin ); 190 fprintf( stdout, "\nldap_dn2dcedn(\"%s\")\n" 191 "\t= \"%s\"\n", strin, tmp ? tmp : "" ); 192 tmp2 = ldap_dcedn2dn( tmp ); 193 fprintf( stdout, "\nldap_dcedn2dn(\"%s\")\n" 194 "\t= \"%s\"\n", 195 tmp ? tmp : "", tmp2 ? tmp2 : "" ); 196 ldap_memfree( tmp ); 197 ldap_memfree( tmp2 ); 198 199 tmp = ldap_dn2ad_canonical( strin ); 200 fprintf( stdout, "\nldap_dn2ad_canonical(\"%s\")\n" 201 "\t= \"%s\"\n", strin, tmp ? tmp : "" ); 202 ldap_memfree( tmp ); 203 204 fprintf( stdout, "\nldap_explode_dn(\"%s\"):\n", str ); 205 values = ldap_explode_dn( str, 0 ); 206 for ( n = 0; values && values[ n ]; n++ ) { 207 char **vv; 208 int nn; 209 210 fprintf( stdout, "\t\"%s\"\n", values[ n ] ); 211 212 fprintf( stdout, "\tldap_explode_rdn(\"%s\")\n", 213 values[ n ] ); 214 vv = ldap_explode_rdn( values[ n ], 0 ); 215 for ( nn = 0; vv && vv[ nn ]; nn++ ) { 216 fprintf( stdout, "\t\t'%s'\n", 217 vv[ nn ] ); 218 } 219 LDAP_VFREE( vv ); 220 221 fprintf( stdout, "\tldap_explode_rdn(\"%s\")" 222 " (no types)\n", values[ n ] ); 223 vv = ldap_explode_rdn( values[ n ], 1 ); 224 for ( nn = 0; vv && vv[ nn ]; nn++ ) { 225 fprintf( stdout, "\t\t\t\"%s\"\n", 226 vv[ nn ] ); 227 } 228 LDAP_VFREE( vv ); 229 230 } 231 LDAP_VFREE( values ); 232 233 fprintf( stdout, "\nldap_explode_dn(\"%s\")" 234 " (no types):\n", str ); 235 values = ldap_explode_dn( str, 1 ); 236 for ( n = 0; values && values[ n ]; n++ ) { 237 fprintf( stdout, "\t\"%s\"\n", values[ n ] ); 238 } 239 LDAP_VFREE( values ); 240 241 break; 242 } 243 244 dn2 = NULL; 245 rc = ldap_str2dn( str, &dn2, flags[ f2 ] ); 246 str2 = NULL; 247 if ( rc == LDAP_SUCCESS && 248 ldap_dn2str( dn2, &str2, flags[ f2 ] ) 249 == LDAP_SUCCESS ) { 250 int iRDN; 251 252 fprintf( stdout, "\n\"%s\"\n\t == \"%s\" ? %s\n", 253 str, str2, 254 strcmp( str, str2 ) == 0 ? "yes" : "no" ); 255 256 if( dn != NULL && dn2 == NULL ) { 257 fprintf( stdout, "dn mismatch\n" ); 258 } else if (( dn != NULL ) && (dn2 != NULL)) 259 for ( iRDN = 0; dn[ iRDN ] && dn2[ iRDN ]; iRDN++ ) 260 { 261 LDAPRDN r = dn[ iRDN ]; 262 LDAPRDN r2 = dn2[ iRDN ]; 263 int iAVA; 264 265 for ( iAVA = 0; r[ iAVA ] && r2[ iAVA ]; iAVA++ ) { 266 LDAPAVA *a = r[ iAVA ]; 267 LDAPAVA *a2 = r2[ iAVA ]; 268 269 if ( a->la_attr.bv_len != a2->la_attr.bv_len ) { 270 fprintf( stdout, "ava(%d), rdn(%d) attr len mismatch (%ld->%ld)\n", 271 iAVA + 1, iRDN + 1, 272 a->la_attr.bv_len, a2->la_attr.bv_len ); 273 } else if ( memcmp( a->la_attr.bv_val, a2->la_attr.bv_val, a->la_attr.bv_len ) ) { 274 fprintf( stdout, "ava(%d), rdn(%d) attr mismatch\n", 275 iAVA + 1, iRDN + 1 ); 276 } else if ( a->la_flags != a2->la_flags ) { 277 fprintf( stdout, "ava(%d), rdn(%d) flag mismatch (%x->%x)\n", 278 iAVA + 1, iRDN + 1, a->la_flags, a2->la_flags ); 279 } else if ( a->la_value.bv_len != a2->la_value.bv_len ) { 280 fprintf( stdout, "ava(%d), rdn(%d) value len mismatch (%ld->%ld)\n", 281 iAVA + 1, iRDN + 1, 282 a->la_value.bv_len, a2->la_value.bv_len ); 283 } else if ( memcmp( a->la_value.bv_val, a2->la_value.bv_val, a->la_value.bv_len ) ) { 284 fprintf( stdout, "ava(%d), rdn(%d) value mismatch\n", 285 iAVA + 1, iRDN + 1 ); 286 } 287 } 288 } 289 290 ldap_dnfree( dn2 ); 291 ldap_memfree( str2 ); 292 } 293 ldap_memfree( str ); 294 } 295 ldap_dnfree( dn ); 296 297 /* note: dn is not freed */ 298 299 return( 0 ); 300 } 301 302