1 /* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */ 2 /* 3 * Copyright (c) 2003 Kungliga Tekniska Högskolan 4 * (Royal Institute of Technology, Stockholm, Sweden). 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 18 * 3. Neither the name of KTH nor the names of its contributors may be 19 * used to endorse or promote products derived from this software without 20 * specific prior written permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY 23 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 25 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE 26 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 29 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 30 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 31 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 32 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33 */ 34 35 #include "k5-int.h" 36 37 /* 38 * Check that a closed cc still keeps it data and that it's no longer 39 * there when it's destroyed. 40 */ 41 42 #if !defined(__cplusplus) && (__GNUC__ > 2) 43 static void err(krb5_context ctx, krb5_error_code code, const char *fmt, ...) 44 __attribute__((__format__(__printf__, 3, 0))); 45 #endif 46 47 static void 48 err(krb5_context ctx, krb5_error_code code, const char *fmt, ...) 49 { 50 va_list ap; 51 char *msg; 52 const char *errmsg = NULL; 53 54 va_start(ap, fmt); 55 if (vasprintf(&msg, fmt, ap) < 0) 56 exit(1); 57 va_end(ap); 58 if (ctx && code) 59 errmsg = krb5_get_error_message(ctx, code); 60 if (errmsg) 61 fprintf(stderr, "t_princ: %s: %s\n", msg, errmsg); 62 else 63 fprintf(stderr, "t_princ: %s\n", msg); 64 exit(1); 65 } 66 67 static void 68 test_princ(krb5_context context) 69 { 70 const char *princ = "lha@SU.SE"; 71 const char *princ_short = "lha"; 72 const char *noquote; 73 krb5_error_code ret; 74 char *princ_unparsed; 75 char *princ_reformed = NULL; 76 const char *realm; 77 78 krb5_principal p, p2; 79 80 ret = krb5_parse_name(context, princ, &p); 81 if (ret) 82 err(context, ret, "krb5_parse_name"); 83 84 ret = krb5_unparse_name(context, p, &princ_unparsed); 85 if (ret) 86 err(context, ret, "krb5_parse_name"); 87 88 if (strcmp(princ, princ_unparsed)) { 89 err(context, 0, "%s != %s", princ, princ_unparsed); 90 } 91 92 free(princ_unparsed); 93 94 ret = krb5_unparse_name_flags(context, p, 95 KRB5_PRINCIPAL_UNPARSE_NO_REALM, 96 &princ_unparsed); 97 if (ret) 98 err(context, ret, "krb5_parse_name"); 99 100 if (strcmp(princ_short, princ_unparsed)) 101 err(context, 0, "%s != %s", princ_short, princ_unparsed); 102 free(princ_unparsed); 103 104 realm = p->realm.data; 105 106 asprintf(&princ_reformed, "%s@%s", princ_short, realm); 107 108 ret = krb5_parse_name(context, princ_reformed, &p2); 109 free(princ_reformed); 110 if (ret) 111 err(context, ret, "krb5_parse_name"); 112 113 if (!krb5_principal_compare(context, p, p2)) { 114 err(context, 0, "p != p2"); 115 } 116 117 krb5_free_principal(context, p2); 118 119 ret = krb5_set_default_realm(context, "SU.SE"); 120 if (ret) 121 err(context, ret, "krb5_parse_name"); 122 123 ret = krb5_unparse_name_flags(context, p, 124 KRB5_PRINCIPAL_UNPARSE_SHORT, 125 &princ_unparsed); 126 if (ret) 127 err(context, ret, "krb5_parse_name"); 128 129 if (strcmp(princ_short, princ_unparsed)) 130 err(context, 0, "'%s' != '%s'", princ_short, princ_unparsed); 131 free(princ_unparsed); 132 133 ret = krb5_parse_name(context, princ_short, &p2); 134 if (ret) 135 err(context, ret, "krb5_parse_name"); 136 137 if (!krb5_principal_compare(context, p, p2)) 138 err(context, 0, "p != p2"); 139 krb5_free_principal(context, p2); 140 141 ret = krb5_unparse_name(context, p, &princ_unparsed); 142 if (ret) 143 err(context, ret, "krb5_parse_name"); 144 145 if (strcmp(princ, princ_unparsed)) 146 err(context, 0, "'%s' != '%s'", princ, princ_unparsed); 147 free(princ_unparsed); 148 149 ret = krb5_set_default_realm(context, "SAMBA.ORG"); 150 if (ret) 151 err(context, ret, "krb5_parse_name"); 152 153 ret = krb5_parse_name(context, princ_short, &p2); 154 if (ret) 155 err(context, ret, "krb5_parse_name"); 156 157 if (krb5_principal_compare(context, p, p2)) 158 err(context, 0, "p == p2"); 159 160 if (!krb5_principal_compare_any_realm(context, p, p2)) 161 err(context, 0, "(ignoring realms) p != p2"); 162 163 ret = krb5_unparse_name(context, p2, &princ_unparsed); 164 if (ret) 165 err(context, ret, "krb5_parse_name"); 166 167 if (strcmp(princ, princ_unparsed) == 0) 168 err(context, 0, "%s == %s", princ, princ_unparsed); 169 free(princ_unparsed); 170 171 krb5_free_principal(context, p2); 172 173 ret = krb5_parse_name(context, princ, &p2); 174 if (ret) 175 err(context, ret, "krb5_parse_name"); 176 177 if (!krb5_principal_compare(context, p, p2)) 178 err(context, 0, "p != p2"); 179 180 ret = krb5_unparse_name(context, p2, &princ_unparsed); 181 if (ret) 182 err(context, ret, "krb5_parse_name"); 183 184 if (strcmp(princ, princ_unparsed)) 185 err(context, 0, "'%s' != '%s'", princ, princ_unparsed); 186 free(princ_unparsed); 187 188 krb5_free_principal(context, p2); 189 190 ret = krb5_unparse_name_flags(context, p, 191 KRB5_PRINCIPAL_UNPARSE_SHORT, 192 &princ_unparsed); 193 if (ret) 194 err(context, ret, "krb5_unparse_name_short"); 195 196 if (strcmp(princ, princ_unparsed) != 0) 197 err(context, 0, "'%s' != '%s'", princ, princ_unparsed); 198 free(princ_unparsed); 199 200 ret = krb5_unparse_name(context, p, &princ_unparsed); 201 if (ret) 202 err(context, ret, "krb5_unparse_name_short"); 203 204 if (strcmp(princ, princ_unparsed)) 205 err(context, 0, "'%s' != '%s'", princ, princ_unparsed); 206 free(princ_unparsed); 207 208 ret = krb5_parse_name_flags(context, princ, 209 KRB5_PRINCIPAL_PARSE_NO_REALM, 210 &p2); 211 if (!ret) 212 err(context, ret, "Should have failed to parse %s a " 213 "short name", princ); 214 215 ret = krb5_parse_name_flags(context, princ_short, 216 KRB5_PRINCIPAL_PARSE_NO_REALM, 217 &p2); 218 if (ret) 219 err(context, ret, "krb5_parse_name"); 220 221 ret = krb5_unparse_name_flags(context, p2, 222 KRB5_PRINCIPAL_UNPARSE_NO_REALM, 223 &princ_unparsed); 224 krb5_free_principal(context, p2); 225 if (ret) 226 err(context, ret, "krb5_unparse_name_norealm"); 227 228 if (strcmp(princ_short, princ_unparsed)) 229 err(context, 0, "'%s' != '%s'", princ_short, princ_unparsed); 230 free(princ_unparsed); 231 232 ret = krb5_parse_name_flags(context, princ_short, 233 KRB5_PRINCIPAL_PARSE_REQUIRE_REALM, 234 &p2); 235 if (!ret) 236 err(context, ret, "Should have failed to parse %s " 237 "because it lacked a realm", princ_short); 238 239 ret = krb5_parse_name_flags(context, princ, 240 KRB5_PRINCIPAL_PARSE_REQUIRE_REALM, 241 &p2); 242 if (ret) 243 err(context, ret, "krb5_parse_name"); 244 245 if (!krb5_principal_compare(context, p, p2)) 246 err(context, 0, "p != p2"); 247 248 ret = krb5_unparse_name_flags(context, p2, 249 KRB5_PRINCIPAL_UNPARSE_NO_REALM, 250 &princ_unparsed); 251 krb5_free_principal(context, p2); 252 if (ret) 253 err(context, ret, "krb5_unparse_name_norealm"); 254 255 if (strcmp(princ_short, princ_unparsed)) 256 err(context, 0, "'%s' != '%s'", princ_short, princ_unparsed); 257 free(princ_unparsed); 258 259 krb5_free_principal(context, p); 260 261 /* test quoting */ 262 263 princ = "test\\/principal@SU.SE"; 264 noquote = "test/principal@SU.SE"; 265 266 ret = krb5_parse_name_flags(context, princ, 0, &p); 267 if (ret) 268 err(context, ret, "krb5_parse_name"); 269 270 ret = krb5_unparse_name_flags(context, p, 0, &princ_unparsed); 271 if (ret) 272 err(context, ret, "krb5_unparse_name_flags"); 273 274 if (strcmp(princ, princ_unparsed)) 275 err(context, 0, "q '%s' != '%s'", princ, princ_unparsed); 276 free(princ_unparsed); 277 278 ret = krb5_unparse_name_flags(context, p, KRB5_PRINCIPAL_UNPARSE_DISPLAY, 279 &princ_unparsed); 280 if (ret) 281 err(context, ret, "krb5_unparse_name_flags"); 282 283 if (strcmp(noquote, princ_unparsed)) 284 err(context, 0, "nq '%s' != '%s'", noquote, princ_unparsed); 285 free(princ_unparsed); 286 287 krb5_free_principal(context, p); 288 } 289 290 static void 291 test_enterprise(krb5_context context) 292 { 293 krb5_error_code ret; 294 char *unparsed; 295 krb5_principal p; 296 297 ret = krb5_set_default_realm(context, "SAMBA.ORG"); 298 if (ret) 299 err(context, ret, "krb5_parse_name"); 300 301 ret = krb5_parse_name_flags(context, "lha@su.se@WIN.SU.SE", 302 KRB5_PRINCIPAL_PARSE_ENTERPRISE, &p); 303 if (ret) 304 err(context, ret, "krb5_parse_name_flags"); 305 306 ret = krb5_unparse_name(context, p, &unparsed); 307 if (ret) 308 err(context, ret, "krb5_unparse_name"); 309 310 krb5_free_principal(context, p); 311 312 if (strcmp(unparsed, "lha\\@su.se@WIN.SU.SE") != 0) 313 err(context, 0, "enterprise name failed 1"); 314 free(unparsed); 315 316 /* 317 * 318 */ 319 320 ret = krb5_parse_name_flags(context, "lha\\@su.se@WIN.SU.SE", 321 KRB5_PRINCIPAL_PARSE_ENTERPRISE, &p); 322 if (ret) 323 err(context, ret, "krb5_parse_name_flags"); 324 325 ret = krb5_unparse_name(context, p, &unparsed); 326 if (ret) 327 err(context, ret, "krb5_unparse_name"); 328 329 krb5_free_principal(context, p); 330 if (strcmp(unparsed, "lha\\@su.se\\@WIN.SU.SE@SAMBA.ORG") != 0) 331 err(context, 0, "enterprise name failed 2: %s", unparsed); 332 free(unparsed); 333 334 /* 335 * 336 */ 337 338 ret = krb5_parse_name_flags(context, "lha\\@su.se@WIN.SU.SE", 0, &p); 339 if (ret) 340 err(context, ret, "krb5_parse_name_flags"); 341 342 ret = krb5_unparse_name(context, p, &unparsed); 343 if (ret) 344 err(context, ret, "krb5_unparse_name"); 345 346 krb5_free_principal(context, p); 347 if (strcmp(unparsed, "lha\\@su.se@WIN.SU.SE") != 0) 348 err(context, 0, "enterprise name failed 3"); 349 free(unparsed); 350 351 /* 352 * 353 */ 354 355 ret = krb5_parse_name_flags(context, "lha@su.se", 356 KRB5_PRINCIPAL_PARSE_ENTERPRISE, &p); 357 if (ret) 358 err(context, ret, "krb5_parse_name_flags"); 359 360 ret = krb5_unparse_name(context, p, &unparsed); 361 if (ret) 362 err(context, ret, "krb5_unparse_name"); 363 364 krb5_free_principal(context, p); 365 if (strcmp(unparsed, "lha\\@su.se@SAMBA.ORG") != 0) 366 err(context, 0, "enterprise name failed 2: %s", unparsed); 367 free(unparsed); 368 369 370 ret = krb5_parse_name_flags(context, "lukeh@ntdev.padl.com", 371 KRB5_PRINCIPAL_PARSE_ENTERPRISE, &p); 372 if (ret) 373 err(context, ret, "krb5_parse_name_flags"); 374 375 ret = krb5_unparse_name_flags(context, p, KRB5_PRINCIPAL_UNPARSE_NO_REALM, 376 &unparsed); 377 if (ret) 378 err(context, ret, "krb5_unparse_name"); 379 380 krb5_free_principal(context, p); 381 if (strcmp(unparsed, "lukeh@ntdev.padl.com") != 0) 382 err(context, 0, "enterprise name failed 4: %s", unparsed); 383 free(unparsed); 384 } 385 386 387 int 388 main(int argc, char **argv) 389 { 390 krb5_context context; 391 krb5_error_code ret; 392 393 ret = krb5_init_context(&context); 394 if (ret) 395 err(NULL, 0, "krb5_init_context failed: %d", ret); 396 397 test_princ(context); 398 399 test_enterprise(context); 400 401 krb5_free_context(context); 402 403 return 0; 404 } 405