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