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