1 /*	$NetBSD: parse-name-test.c,v 1.1.1.1 2011/04/13 18:15:36 elric Exp $	*/
2 
3 /*
4  * Copyright (c) 2002 Kungliga Tekniska Högskolan
5  * (Royal Institute of Technology, Stockholm, Sweden).
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  *
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * 3. Neither the name of KTH nor the names of its contributors may be
20  *    used to endorse or promote products derived from this software without
21  *    specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY
24  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
26  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE
27  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
30  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
31  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
32  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
33  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
34 
35 #include "krb5_locl.h"
36 #include <err.h>
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
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 }
195