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