1 /* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */
3 * Copyright (c) 2003 Kungliga Tekniska Högskolan
4 * (Royal Institute of Technology, Stockholm, Sweden).
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
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.
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.
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.
38 * Check that a closed cc still keeps it data and that it's no longer
39 * there when it's destroyed.
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)));
48 err(krb5_context ctx, krb5_error_code code, const char *fmt, ...)
52 const char *errmsg = NULL;
55 if (vasprintf(&msg, fmt, ap) < 0)
59 errmsg = krb5_get_error_message(ctx, code);
61 fprintf(stderr, "t_princ: %s: %s\n", msg, errmsg);
63 fprintf(stderr, "t_princ: %s\n", msg);
68 test_princ(krb5_context context)
70 const char *princ = "lha@SU.SE";
71 const char *princ_short = "lha";
75 char *princ_reformed = NULL;
80 ret = krb5_parse_name(context, princ, &p);
82 err(context, ret, "krb5_parse_name");
84 ret = krb5_unparse_name(context, p, &princ_unparsed);
86 err(context, ret, "krb5_parse_name");
88 if (strcmp(princ, princ_unparsed)) {
89 err(context, 0, "%s != %s", princ, princ_unparsed);
94 ret = krb5_unparse_name_flags(context, p,
95 KRB5_PRINCIPAL_UNPARSE_NO_REALM,
98 err(context, ret, "krb5_parse_name");
100 if (strcmp(princ_short, princ_unparsed))
101 err(context, 0, "%s != %s", princ_short, princ_unparsed);
102 free(princ_unparsed);
104 realm = p->realm.data;
106 asprintf(&princ_reformed, "%s@%s", princ_short, realm);
108 ret = krb5_parse_name(context, princ_reformed, &p2);
109 free(princ_reformed);
111 err(context, ret, "krb5_parse_name");
113 if (!krb5_principal_compare(context, p, p2)) {
114 err(context, 0, "p != p2");
117 krb5_free_principal(context, p2);
119 ret = krb5_set_default_realm(context, "SU.SE");
121 err(context, ret, "krb5_parse_name");
123 ret = krb5_unparse_name_flags(context, p,
124 KRB5_PRINCIPAL_UNPARSE_SHORT,
127 err(context, ret, "krb5_parse_name");
129 if (strcmp(princ_short, princ_unparsed))
130 err(context, 0, "'%s' != '%s'", princ_short, princ_unparsed);
131 free(princ_unparsed);
133 ret = krb5_parse_name(context, princ_short, &p2);
135 err(context, ret, "krb5_parse_name");
137 if (!krb5_principal_compare(context, p, p2))
138 err(context, 0, "p != p2");
139 krb5_free_principal(context, p2);
141 ret = krb5_unparse_name(context, p, &princ_unparsed);
143 err(context, ret, "krb5_parse_name");
145 if (strcmp(princ, princ_unparsed))
146 err(context, 0, "'%s' != '%s'", princ, princ_unparsed);
147 free(princ_unparsed);
149 ret = krb5_set_default_realm(context, "SAMBA.ORG");
151 err(context, ret, "krb5_parse_name");
153 ret = krb5_parse_name(context, princ_short, &p2);
155 err(context, ret, "krb5_parse_name");
157 if (krb5_principal_compare(context, p, p2))
158 err(context, 0, "p == p2");
160 if (!krb5_principal_compare_any_realm(context, p, p2))
161 err(context, 0, "(ignoring realms) p != p2");
163 ret = krb5_unparse_name(context, p2, &princ_unparsed);
165 err(context, ret, "krb5_parse_name");
167 if (strcmp(princ, princ_unparsed) == 0)
168 err(context, 0, "%s == %s", princ, princ_unparsed);
169 free(princ_unparsed);
171 krb5_free_principal(context, p2);
173 ret = krb5_parse_name(context, princ, &p2);
175 err(context, ret, "krb5_parse_name");
177 if (!krb5_principal_compare(context, p, p2))
178 err(context, 0, "p != p2");
180 ret = krb5_unparse_name(context, p2, &princ_unparsed);
182 err(context, ret, "krb5_parse_name");
184 if (strcmp(princ, princ_unparsed))
185 err(context, 0, "'%s' != '%s'", princ, princ_unparsed);
186 free(princ_unparsed);
188 krb5_free_principal(context, p2);
190 ret = krb5_unparse_name_flags(context, p,
191 KRB5_PRINCIPAL_UNPARSE_SHORT,
194 err(context, ret, "krb5_unparse_name_short");
196 if (strcmp(princ, princ_unparsed) != 0)
197 err(context, 0, "'%s' != '%s'", princ, princ_unparsed);
198 free(princ_unparsed);
200 ret = krb5_unparse_name(context, p, &princ_unparsed);
202 err(context, ret, "krb5_unparse_name_short");
204 if (strcmp(princ, princ_unparsed))
205 err(context, 0, "'%s' != '%s'", princ, princ_unparsed);
206 free(princ_unparsed);
208 ret = krb5_parse_name_flags(context, princ,
209 KRB5_PRINCIPAL_PARSE_NO_REALM,
212 err(context, ret, "Should have failed to parse %s a "
213 "short name", princ);
215 ret = krb5_parse_name_flags(context, princ_short,
216 KRB5_PRINCIPAL_PARSE_NO_REALM,
219 err(context, ret, "krb5_parse_name");
221 ret = krb5_unparse_name_flags(context, p2,
222 KRB5_PRINCIPAL_UNPARSE_NO_REALM,
224 krb5_free_principal(context, p2);
226 err(context, ret, "krb5_unparse_name_norealm");
228 if (strcmp(princ_short, princ_unparsed))
229 err(context, 0, "'%s' != '%s'", princ_short, princ_unparsed);
230 free(princ_unparsed);
232 ret = krb5_parse_name_flags(context, princ_short,
233 KRB5_PRINCIPAL_PARSE_REQUIRE_REALM,
236 err(context, ret, "Should have failed to parse %s "
237 "because it lacked a realm", princ_short);
239 ret = krb5_parse_name_flags(context, princ,
240 KRB5_PRINCIPAL_PARSE_REQUIRE_REALM,
243 err(context, ret, "krb5_parse_name");
245 if (!krb5_principal_compare(context, p, p2))
246 err(context, 0, "p != p2");
248 ret = krb5_unparse_name_flags(context, p2,
249 KRB5_PRINCIPAL_UNPARSE_NO_REALM,
251 krb5_free_principal(context, p2);
253 err(context, ret, "krb5_unparse_name_norealm");
255 if (strcmp(princ_short, princ_unparsed))
256 err(context, 0, "'%s' != '%s'", princ_short, princ_unparsed);
257 free(princ_unparsed);
259 krb5_free_principal(context, p);
263 princ = "test\\/principal@SU.SE";
264 noquote = "test/principal@SU.SE";
266 ret = krb5_parse_name_flags(context, princ, 0, &p);
268 err(context, ret, "krb5_parse_name");
270 ret = krb5_unparse_name_flags(context, p, 0, &princ_unparsed);
272 err(context, ret, "krb5_unparse_name_flags");
274 if (strcmp(princ, princ_unparsed))
275 err(context, 0, "q '%s' != '%s'", princ, princ_unparsed);
276 free(princ_unparsed);
278 ret = krb5_unparse_name_flags(context, p, KRB5_PRINCIPAL_UNPARSE_DISPLAY,
281 err(context, ret, "krb5_unparse_name_flags");
283 if (strcmp(noquote, princ_unparsed))
284 err(context, 0, "nq '%s' != '%s'", noquote, princ_unparsed);
285 free(princ_unparsed);
287 krb5_free_principal(context, p);
291 test_enterprise(krb5_context context)
297 ret = krb5_set_default_realm(context, "SAMBA.ORG");
299 err(context, ret, "krb5_parse_name");
301 ret = krb5_parse_name_flags(context, "lha@su.se@WIN.SU.SE",
302 KRB5_PRINCIPAL_PARSE_ENTERPRISE, &p);
304 err(context, ret, "krb5_parse_name_flags");
306 ret = krb5_unparse_name(context, p, &unparsed);
308 err(context, ret, "krb5_unparse_name");
310 krb5_free_principal(context, p);
312 if (strcmp(unparsed, "lha\\@su.se@WIN.SU.SE") != 0)
313 err(context, 0, "enterprise name failed 1");
320 ret = krb5_parse_name_flags(context, "lha\\@su.se@WIN.SU.SE",
321 KRB5_PRINCIPAL_PARSE_ENTERPRISE, &p);
323 err(context, ret, "krb5_parse_name_flags");
325 ret = krb5_unparse_name(context, p, &unparsed);
327 err(context, ret, "krb5_unparse_name");
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);
338 ret = krb5_parse_name_flags(context, "lha\\@su.se@WIN.SU.SE", 0, &p);
340 err(context, ret, "krb5_parse_name_flags");
342 ret = krb5_unparse_name(context, p, &unparsed);
344 err(context, ret, "krb5_unparse_name");
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");
355 ret = krb5_parse_name_flags(context, "lha@su.se",
356 KRB5_PRINCIPAL_PARSE_ENTERPRISE, &p);
358 err(context, ret, "krb5_parse_name_flags");
360 ret = krb5_unparse_name(context, p, &unparsed);
362 err(context, ret, "krb5_unparse_name");
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);
370 ret = krb5_parse_name_flags(context, "lukeh@ntdev.padl.com",
371 KRB5_PRINCIPAL_PARSE_ENTERPRISE, &p);
373 err(context, ret, "krb5_parse_name_flags");
375 ret = krb5_unparse_name_flags(context, p, KRB5_PRINCIPAL_UNPARSE_NO_REALM,
378 err(context, ret, "krb5_unparse_name");
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);
388 main(int argc, char **argv)
390 krb5_context context;
393 ret = krb5_init_context(&context);
395 err(NULL, 0, "krb5_init_context failed: %d", ret);
399 test_enterprise(context);
401 krb5_free_context(context);