Imported Upstream version 1.15.1
[platform/upstream/krb5.git] / src / lib / krb5 / krb / t_princ.c
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 }