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