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