1178825Sdfr/*
2233294Sstas * Copyright (c) 2003 Kungliga Tekniska H��gskolan
3233294Sstas * (Royal Institute of Technology, Stockholm, Sweden).
4233294Sstas * All rights reserved.
5178825Sdfr *
6233294Sstas * Redistribution and use in source and binary forms, with or without
7233294Sstas * modification, are permitted provided that the following conditions
8233294Sstas * are met:
9178825Sdfr *
10233294Sstas * 1. Redistributions of source code must retain the above copyright
11233294Sstas *    notice, this list of conditions and the following disclaimer.
12178825Sdfr *
13233294Sstas * 2. Redistributions in binary form must reproduce the above copyright
14233294Sstas *    notice, this list of conditions and the following disclaimer in the
15233294Sstas *    documentation and/or other materials provided with the distribution.
16178825Sdfr *
17178825Sdfr * 3. Neither the name of KTH nor the names of its contributors may be
18178825Sdfr *    used to endorse or promote products derived from this software without
19178825Sdfr *    specific prior written permission.
20178825Sdfr *
21178825Sdfr * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY
22178825Sdfr * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23178825Sdfr * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24178825Sdfr * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE
25178825Sdfr * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26178825Sdfr * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27178825Sdfr * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
28178825Sdfr * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
29178825Sdfr * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
30178825Sdfr * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
31178825Sdfr * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
32178825Sdfr
33178825Sdfr#include "krb5_locl.h"
34178825Sdfr#include <err.h>
35178825Sdfr
36178825Sdfr/*
37178825Sdfr * Check that a closed cc still keeps it data and that it's no longer
38178825Sdfr * there when it's destroyed.
39178825Sdfr */
40178825Sdfr
41178825Sdfrstatic void
42178825Sdfrtest_princ(krb5_context context)
43178825Sdfr{
44178825Sdfr    const char *princ = "lha@SU.SE";
45178825Sdfr    const char *princ_short = "lha";
46178825Sdfr    const char *noquote;
47178825Sdfr    krb5_error_code ret;
48178825Sdfr    char *princ_unparsed;
49178825Sdfr    char *princ_reformed = NULL;
50178825Sdfr    const char *realm;
51178825Sdfr
52178825Sdfr    krb5_principal p, p2;
53178825Sdfr
54178825Sdfr    ret = krb5_parse_name(context, princ, &p);
55178825Sdfr    if (ret)
56178825Sdfr	krb5_err(context, 1, ret, "krb5_parse_name");
57178825Sdfr
58178825Sdfr    ret = krb5_unparse_name(context, p, &princ_unparsed);
59178825Sdfr    if (ret)
60178825Sdfr	krb5_err(context, 1, ret, "krb5_parse_name");
61178825Sdfr
62178825Sdfr    if (strcmp(princ, princ_unparsed)) {
63178825Sdfr	krb5_errx(context, 1, "%s != %s", princ, princ_unparsed);
64178825Sdfr    }
65178825Sdfr
66178825Sdfr    free(princ_unparsed);
67178825Sdfr
68233294Sstas    ret = krb5_unparse_name_flags(context, p,
69178825Sdfr				  KRB5_PRINCIPAL_UNPARSE_NO_REALM,
70178825Sdfr				  &princ_unparsed);
71178825Sdfr    if (ret)
72178825Sdfr	krb5_err(context, 1, ret, "krb5_parse_name");
73178825Sdfr
74178825Sdfr    if (strcmp(princ_short, princ_unparsed))
75178825Sdfr	krb5_errx(context, 1, "%s != %s", princ_short, princ_unparsed);
76178825Sdfr    free(princ_unparsed);
77233294Sstas
78178825Sdfr    realm = krb5_principal_get_realm(context, p);
79178825Sdfr
80233294Sstas    if (asprintf(&princ_reformed, "%s@%s", princ_short, realm) < 0 || princ_reformed == NULL)
81233294Sstas	errx(1, "malloc");
82178825Sdfr
83178825Sdfr    ret = krb5_parse_name(context, princ_reformed, &p2);
84178825Sdfr    free(princ_reformed);
85178825Sdfr    if (ret)
86178825Sdfr	krb5_err(context, 1, ret, "krb5_parse_name");
87178825Sdfr
88178825Sdfr    if (!krb5_principal_compare(context, p, p2)) {
89178825Sdfr	krb5_errx(context, 1, "p != p2");
90233294Sstas    }
91178825Sdfr
92178825Sdfr    krb5_free_principal(context, p2);
93178825Sdfr
94178825Sdfr    ret = krb5_set_default_realm(context, "SU.SE");
95178825Sdfr    if (ret)
96178825Sdfr	krb5_err(context, 1, ret, "krb5_parse_name");
97178825Sdfr
98233294Sstas    ret = krb5_unparse_name_flags(context, p,
99178825Sdfr				  KRB5_PRINCIPAL_UNPARSE_SHORT,
100178825Sdfr				  &princ_unparsed);
101178825Sdfr    if (ret)
102178825Sdfr	krb5_err(context, 1, ret, "krb5_parse_name");
103178825Sdfr
104178825Sdfr    if (strcmp(princ_short, princ_unparsed))
105178825Sdfr	krb5_errx(context, 1, "'%s' != '%s'", princ_short, princ_unparsed);
106178825Sdfr    free(princ_unparsed);
107178825Sdfr
108178825Sdfr    ret = krb5_parse_name(context, princ_short, &p2);
109178825Sdfr    if (ret)
110178825Sdfr	krb5_err(context, 1, ret, "krb5_parse_name");
111178825Sdfr
112178825Sdfr    if (!krb5_principal_compare(context, p, p2))
113178825Sdfr	krb5_errx(context, 1, "p != p2");
114178825Sdfr    krb5_free_principal(context, p2);
115178825Sdfr
116178825Sdfr    ret = krb5_unparse_name(context, p, &princ_unparsed);
117178825Sdfr    if (ret)
118178825Sdfr	krb5_err(context, 1, ret, "krb5_parse_name");
119178825Sdfr
120178825Sdfr    if (strcmp(princ, princ_unparsed))
121178825Sdfr	krb5_errx(context, 1, "'%s' != '%s'", princ, princ_unparsed);
122178825Sdfr    free(princ_unparsed);
123178825Sdfr
124178825Sdfr    ret = krb5_set_default_realm(context, "SAMBA.ORG");
125178825Sdfr    if (ret)
126178825Sdfr	krb5_err(context, 1, ret, "krb5_parse_name");
127178825Sdfr
128178825Sdfr    ret = krb5_parse_name(context, princ_short, &p2);
129178825Sdfr    if (ret)
130178825Sdfr	krb5_err(context, 1, ret, "krb5_parse_name");
131178825Sdfr
132178825Sdfr    if (krb5_principal_compare(context, p, p2))
133178825Sdfr	krb5_errx(context, 1, "p == p2");
134178825Sdfr
135178825Sdfr    if (!krb5_principal_compare_any_realm(context, p, p2))
136178825Sdfr	krb5_errx(context, 1, "(ignoring realms) p != p2");
137178825Sdfr
138178825Sdfr    ret = krb5_unparse_name(context, p2, &princ_unparsed);
139178825Sdfr    if (ret)
140178825Sdfr	krb5_err(context, 1, ret, "krb5_parse_name");
141178825Sdfr
142178825Sdfr    if (strcmp(princ, princ_unparsed) == 0)
143178825Sdfr	krb5_errx(context, 1, "%s == %s", princ, princ_unparsed);
144178825Sdfr    free(princ_unparsed);
145178825Sdfr
146178825Sdfr    krb5_free_principal(context, p2);
147178825Sdfr
148178825Sdfr    ret = krb5_parse_name(context, princ, &p2);
149178825Sdfr    if (ret)
150178825Sdfr	krb5_err(context, 1, ret, "krb5_parse_name");
151178825Sdfr
152178825Sdfr    if (!krb5_principal_compare(context, p, p2))
153178825Sdfr	krb5_errx(context, 1, "p != p2");
154178825Sdfr
155178825Sdfr    ret = krb5_unparse_name(context, p2, &princ_unparsed);
156178825Sdfr    if (ret)
157178825Sdfr	krb5_err(context, 1, ret, "krb5_parse_name");
158178825Sdfr
159178825Sdfr    if (strcmp(princ, princ_unparsed))
160178825Sdfr	krb5_errx(context, 1, "'%s' != '%s'", princ, princ_unparsed);
161178825Sdfr    free(princ_unparsed);
162178825Sdfr
163178825Sdfr    krb5_free_principal(context, p2);
164178825Sdfr
165178825Sdfr    ret = krb5_unparse_name_flags(context, p,
166178825Sdfr				  KRB5_PRINCIPAL_UNPARSE_SHORT,
167178825Sdfr				  &princ_unparsed);
168178825Sdfr    if (ret)
169178825Sdfr	krb5_err(context, 1, ret, "krb5_unparse_name_short");
170178825Sdfr
171178825Sdfr    if (strcmp(princ, princ_unparsed) != 0)
172178825Sdfr	krb5_errx(context, 1, "'%s' != '%s'", princ, princ_unparsed);
173178825Sdfr    free(princ_unparsed);
174178825Sdfr
175178825Sdfr    ret = krb5_unparse_name(context, p, &princ_unparsed);
176178825Sdfr    if (ret)
177178825Sdfr	krb5_err(context, 1, ret, "krb5_unparse_name_short");
178178825Sdfr
179178825Sdfr    if (strcmp(princ, princ_unparsed))
180178825Sdfr	krb5_errx(context, 1, "'%s' != '%s'", princ, princ_unparsed);
181178825Sdfr    free(princ_unparsed);
182178825Sdfr
183233294Sstas    ret = krb5_parse_name_flags(context, princ,
184178825Sdfr				KRB5_PRINCIPAL_PARSE_NO_REALM,
185178825Sdfr				&p2);
186178825Sdfr    if (!ret)
187178825Sdfr	krb5_err(context, 1, ret, "Should have failed to parse %s a "
188178825Sdfr		 "short name", princ);
189178825Sdfr
190233294Sstas    ret = krb5_parse_name_flags(context, princ_short,
191178825Sdfr				KRB5_PRINCIPAL_PARSE_NO_REALM,
192178825Sdfr				&p2);
193178825Sdfr    if (ret)
194178825Sdfr	krb5_err(context, 1, ret, "krb5_parse_name");
195178825Sdfr
196233294Sstas    ret = krb5_unparse_name_flags(context, p2,
197178825Sdfr				  KRB5_PRINCIPAL_UNPARSE_NO_REALM,
198178825Sdfr				  &princ_unparsed);
199178825Sdfr    krb5_free_principal(context, p2);
200178825Sdfr    if (ret)
201178825Sdfr	krb5_err(context, 1, ret, "krb5_unparse_name_norealm");
202178825Sdfr
203178825Sdfr    if (strcmp(princ_short, princ_unparsed))
204178825Sdfr	krb5_errx(context, 1, "'%s' != '%s'", princ_short, princ_unparsed);
205178825Sdfr    free(princ_unparsed);
206178825Sdfr
207233294Sstas    ret = krb5_parse_name_flags(context, princ_short,
208233294Sstas				KRB5_PRINCIPAL_PARSE_REQUIRE_REALM,
209178825Sdfr				&p2);
210178825Sdfr    if (!ret)
211178825Sdfr	krb5_err(context, 1, ret, "Should have failed to parse %s "
212178825Sdfr		 "because it lacked a realm", princ_short);
213178825Sdfr
214178825Sdfr    ret = krb5_parse_name_flags(context, princ,
215233294Sstas				KRB5_PRINCIPAL_PARSE_REQUIRE_REALM,
216178825Sdfr				&p2);
217178825Sdfr    if (ret)
218178825Sdfr	krb5_err(context, 1, ret, "krb5_parse_name");
219233294Sstas
220178825Sdfr    if (!krb5_principal_compare(context, p, p2))
221178825Sdfr	krb5_errx(context, 1, "p != p2");
222178825Sdfr
223233294Sstas    ret = krb5_unparse_name_flags(context, p2,
224178825Sdfr				  KRB5_PRINCIPAL_UNPARSE_NO_REALM,
225178825Sdfr				  &princ_unparsed);
226178825Sdfr    krb5_free_principal(context, p2);
227178825Sdfr    if (ret)
228178825Sdfr	krb5_err(context, 1, ret, "krb5_unparse_name_norealm");
229178825Sdfr
230178825Sdfr    if (strcmp(princ_short, princ_unparsed))
231178825Sdfr	krb5_errx(context, 1, "'%s' != '%s'", princ_short, princ_unparsed);
232178825Sdfr    free(princ_unparsed);
233178825Sdfr
234178825Sdfr    krb5_free_principal(context, p);
235178825Sdfr
236178825Sdfr    /* test quoting */
237178825Sdfr
238178825Sdfr    princ = "test\\ principal@SU.SE";
239178825Sdfr    noquote = "test principal@SU.SE";
240178825Sdfr
241178825Sdfr    ret = krb5_parse_name_flags(context, princ, 0, &p);
242178825Sdfr    if (ret)
243178825Sdfr	krb5_err(context, 1, ret, "krb5_parse_name");
244178825Sdfr
245178825Sdfr    ret = krb5_unparse_name_flags(context, p, 0, &princ_unparsed);
246178825Sdfr    if (ret)
247178825Sdfr	krb5_err(context, 1, ret, "krb5_unparse_name_flags");
248178825Sdfr
249178825Sdfr    if (strcmp(princ, princ_unparsed))
250178825Sdfr	krb5_errx(context, 1, "q '%s' != '%s'", princ, princ_unparsed);
251178825Sdfr    free(princ_unparsed);
252178825Sdfr
253178825Sdfr    ret = krb5_unparse_name_flags(context, p, KRB5_PRINCIPAL_UNPARSE_DISPLAY,
254178825Sdfr				  &princ_unparsed);
255178825Sdfr    if (ret)
256178825Sdfr	krb5_err(context, 1, ret, "krb5_unparse_name_flags");
257178825Sdfr
258178825Sdfr    if (strcmp(noquote, princ_unparsed))
259178825Sdfr	krb5_errx(context, 1, "nq '%s' != '%s'", noquote, princ_unparsed);
260178825Sdfr    free(princ_unparsed);
261178825Sdfr
262178825Sdfr    krb5_free_principal(context, p);
263178825Sdfr}
264178825Sdfr
265178825Sdfrstatic void
266178825Sdfrtest_enterprise(krb5_context context)
267178825Sdfr{
268178825Sdfr    krb5_error_code ret;
269178825Sdfr    char *unparsed;
270178825Sdfr    krb5_principal p;
271178825Sdfr
272178825Sdfr    ret = krb5_set_default_realm(context, "SAMBA.ORG");
273178825Sdfr    if (ret)
274178825Sdfr	krb5_err(context, 1, ret, "krb5_parse_name");
275178825Sdfr
276233294Sstas    ret = krb5_parse_name_flags(context, "lha@su.se@WIN.SU.SE",
277178825Sdfr				KRB5_PRINCIPAL_PARSE_ENTERPRISE, &p);
278178825Sdfr    if (ret)
279178825Sdfr	krb5_err(context, 1, ret, "krb5_parse_name_flags");
280178825Sdfr
281178825Sdfr    ret = krb5_unparse_name(context, p, &unparsed);
282178825Sdfr    if (ret)
283178825Sdfr	krb5_err(context, 1, ret, "krb5_unparse_name");
284178825Sdfr
285178825Sdfr    krb5_free_principal(context, p);
286178825Sdfr
287178825Sdfr    if (strcmp(unparsed, "lha\\@su.se@WIN.SU.SE") != 0)
288178825Sdfr	krb5_errx(context, 1, "enterprise name failed 1");
289178825Sdfr    free(unparsed);
290178825Sdfr
291178825Sdfr    /*
292178825Sdfr     *
293178825Sdfr     */
294178825Sdfr
295233294Sstas    ret = krb5_parse_name_flags(context, "lha\\@su.se@WIN.SU.SE",
296178825Sdfr				KRB5_PRINCIPAL_PARSE_ENTERPRISE, &p);
297178825Sdfr    if (ret)
298178825Sdfr	krb5_err(context, 1, ret, "krb5_parse_name_flags");
299178825Sdfr
300178825Sdfr    ret = krb5_unparse_name(context, p, &unparsed);
301178825Sdfr    if (ret)
302178825Sdfr	krb5_err(context, 1, ret, "krb5_unparse_name");
303178825Sdfr
304178825Sdfr    krb5_free_principal(context, p);
305178825Sdfr    if (strcmp(unparsed, "lha\\@su.se\\@WIN.SU.SE@SAMBA.ORG") != 0)
306178825Sdfr	krb5_errx(context, 1, "enterprise name failed 2: %s", unparsed);
307178825Sdfr    free(unparsed);
308178825Sdfr
309178825Sdfr    /*
310178825Sdfr     *
311178825Sdfr     */
312178825Sdfr
313178825Sdfr    ret = krb5_parse_name_flags(context, "lha\\@su.se@WIN.SU.SE", 0, &p);
314178825Sdfr    if (ret)
315178825Sdfr	krb5_err(context, 1, ret, "krb5_parse_name_flags");
316178825Sdfr
317178825Sdfr    ret = krb5_unparse_name(context, p, &unparsed);
318178825Sdfr    if (ret)
319178825Sdfr	krb5_err(context, 1, ret, "krb5_unparse_name");
320178825Sdfr
321178825Sdfr    krb5_free_principal(context, p);
322178825Sdfr    if (strcmp(unparsed, "lha\\@su.se@WIN.SU.SE") != 0)
323178825Sdfr	krb5_errx(context, 1, "enterprise name failed 3");
324178825Sdfr    free(unparsed);
325178825Sdfr
326178825Sdfr    /*
327178825Sdfr     *
328178825Sdfr     */
329178825Sdfr
330233294Sstas    ret = krb5_parse_name_flags(context, "lha@su.se",
331178825Sdfr				KRB5_PRINCIPAL_PARSE_ENTERPRISE, &p);
332178825Sdfr    if (ret)
333178825Sdfr	krb5_err(context, 1, ret, "krb5_parse_name_flags");
334178825Sdfr
335178825Sdfr    ret = krb5_unparse_name(context, p, &unparsed);
336178825Sdfr    if (ret)
337178825Sdfr	krb5_err(context, 1, ret, "krb5_unparse_name");
338178825Sdfr
339178825Sdfr    krb5_free_principal(context, p);
340178825Sdfr    if (strcmp(unparsed, "lha\\@su.se@SAMBA.ORG") != 0)
341178825Sdfr	krb5_errx(context, 1, "enterprise name failed 2: %s", unparsed);
342178825Sdfr    free(unparsed);
343178825Sdfr}
344178825Sdfr
345178825Sdfr
346178825Sdfrint
347178825Sdfrmain(int argc, char **argv)
348178825Sdfr{
349178825Sdfr    krb5_context context;
350178825Sdfr    krb5_error_code ret;
351178825Sdfr
352178825Sdfr    setprogname(argv[0]);
353178825Sdfr
354178825Sdfr    ret = krb5_init_context(&context);
355178825Sdfr    if (ret)
356178825Sdfr	errx (1, "krb5_init_context failed: %d", ret);
357178825Sdfr
358178825Sdfr    test_princ(context);
359178825Sdfr
360178825Sdfr    test_enterprise(context);
361178825Sdfr
362178825Sdfr    krb5_free_context(context);
363178825Sdfr
364178825Sdfr    return 0;
365178825Sdfr}
366