Home | History | Annotate | Line # | Download | only in krb5
      1 /*	$NetBSD: parse-name-test.c,v 1.2 2017/01/28 21:31:49 christos Exp $	*/
      2 
      3 /*
      4  * Copyright (c) 2002 Kungliga Tekniska Hgskolan
      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