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 } 193