]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - crypto/heimdal/lib/krb5/parse-name-test.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 / parse-name-test.c
1 /*
2  * Copyright (c) 2002 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: parse-name-test.c 16342 2005-12-02 14:14:43Z lha $");
37
38 enum { MAX_COMPONENTS = 3 };
39
40 static struct testcase {
41     const char *input_string;
42     const char *output_string;
43     krb5_realm realm;
44     unsigned ncomponents;
45     char *comp_val[MAX_COMPONENTS];
46     int realmp;
47 } tests[] = {
48     {"", "@", "", 1, {""}, FALSE},
49     {"a", "a@", "", 1, {"a"}, FALSE},
50     {"\\n", "\\n@", "", 1, {"\n"}, FALSE},
51     {"\\ ", "\\ @", "", 1, {" "}, FALSE},
52     {"\\t", "\\t@", "", 1, {"\t"}, FALSE},
53     {"\\b", "\\b@", "", 1, {"\b"}, FALSE},
54     {"\\\\", "\\\\@", "", 1, {"\\"}, FALSE},
55     {"\\/", "\\/@", "", 1, {"/"}, FALSE},
56     {"\\@", "\\@@", "", 1, {"@"}, FALSE},
57     {"@", "@", "", 1, {""}, TRUE},
58     {"a/b", "a/b@", "", 2, {"a", "b"}, FALSE},
59     {"a/", "a/@", "", 2, {"a", ""}, FALSE},
60     {"a\\//\\/", "a\\//\\/@", "", 2, {"a/", "/"}, FALSE},
61     {"/a", "/a@", "", 2, {"", "a"}, FALSE},
62     {"\\@@\\@", "\\@@\\@", "@", 1, {"@"}, TRUE},
63     {"a/b/c", "a/b/c@", "", 3, {"a", "b", "c"}, FALSE},
64     {NULL, NULL, "", 0, { NULL }, FALSE}};
65
66 int KRB5_LIB_FUNCTION
67 main(int argc, char **argv)
68 {
69     struct testcase *t;
70     krb5_context context;
71     krb5_error_code ret;
72     int val = 0;
73
74     ret = krb5_init_context (&context);
75     if (ret)
76         errx (1, "krb5_init_context failed: %d", ret);
77
78     /* to enable realm-less principal name above */
79
80     krb5_set_default_realm(context, "");
81
82     for (t = tests; t->input_string; ++t) {
83         krb5_principal princ;
84         int i, j;
85         char name_buf[1024];
86         char *s;
87
88         ret = krb5_parse_name(context, t->input_string, &princ);
89         if (ret)
90             krb5_err (context, 1, ret, "krb5_parse_name %s",
91                       t->input_string);
92         if (strcmp (t->realm, princ->realm) != 0) {
93             printf ("wrong realm (\"%s\" should be \"%s\")"
94                     " for \"%s\"\n",
95                     princ->realm, t->realm,
96                     t->input_string);
97             val = 1;
98         }
99
100         if (t->ncomponents != princ->name.name_string.len) {
101             printf ("wrong number of components (%u should be %u)"
102                     " for \"%s\"\n",
103                     princ->name.name_string.len, t->ncomponents,
104                     t->input_string);
105             val = 1;
106         } else {
107             for (i = 0; i < t->ncomponents; ++i) {
108                 if (strcmp(t->comp_val[i],
109                            princ->name.name_string.val[i]) != 0) {
110                     printf ("bad component %d (\"%s\" should be \"%s\")"
111                             " for \"%s\"\n",
112                             i,
113                             princ->name.name_string.val[i],
114                             t->comp_val[i],
115                             t->input_string);
116                     val = 1;
117                 }
118             }
119         }
120         for (j = 0; j < strlen(t->output_string); ++j) {
121             ret = krb5_unparse_name_fixed(context, princ,
122                                           name_buf, j);
123             if (ret != ERANGE) {
124                 printf ("unparse_name %s with length %d should have failed\n",
125                         t->input_string, j);
126                 val = 1;
127                 break;
128             }
129         }
130         ret = krb5_unparse_name_fixed(context, princ,
131                                       name_buf, sizeof(name_buf));
132         if (ret)
133             krb5_err (context, 1, ret, "krb5_unparse_name_fixed");
134
135         if (strcmp (t->output_string, name_buf) != 0) {
136             printf ("failed comparing the re-parsed"
137                     " (\"%s\" should be \"%s\")\n",
138                     name_buf, t->output_string);
139             val = 1;
140         }
141
142         ret = krb5_unparse_name(context, princ, &s);
143         if (ret)
144             krb5_err (context, 1, ret, "krb5_unparse_name");
145
146         if (strcmp (t->output_string, s) != 0) {
147             printf ("failed comparing the re-parsed"
148                     " (\"%s\" should be \"%s\"\n",
149                     s, t->output_string);
150             val = 1;
151         }
152         free(s);
153
154         if (!t->realmp) {
155             for (j = 0; j < strlen(t->input_string); ++j) {
156                 ret = krb5_unparse_name_fixed_short(context, princ,
157                                                     name_buf, j);
158                 if (ret != ERANGE) {
159                     printf ("unparse_name_short %s with length %d"
160                             " should have failed\n",
161                             t->input_string, j);
162                     val = 1;
163                     break;
164                 }
165             }
166             ret = krb5_unparse_name_fixed_short(context, princ,
167                                                 name_buf, sizeof(name_buf));
168             if (ret)
169                 krb5_err (context, 1, ret, "krb5_unparse_name_fixed");
170
171             if (strcmp (t->input_string, name_buf) != 0) {
172                 printf ("failed comparing the re-parsed"
173                         " (\"%s\" should be \"%s\")\n",
174                         name_buf, t->input_string);
175                 val = 1;
176             }
177
178             ret = krb5_unparse_name_short(context, princ, &s);
179             if (ret)
180                 krb5_err (context, 1, ret, "krb5_unparse_name_short");
181
182             if (strcmp (t->input_string, s) != 0) {
183                 printf ("failed comparing the re-parsed"
184                         " (\"%s\" should be \"%s\"\n",
185                         s, t->input_string);
186                 val = 1;
187             }
188             free(s);
189         }
190         krb5_free_principal (context, princ);
191     }
192     krb5_free_context(context);
193     return val;
194 }