1120945Snectar/*
2120945Snectar * Copyright (c) 2003 Kungliga Tekniska H�gskolan
3120945Snectar * (Royal Institute of Technology, Stockholm, Sweden).
4120945Snectar * All rights reserved.
5120945Snectar *
6120945Snectar * Redistribution and use in source and binary forms, with or without
7120945Snectar * modification, are permitted provided that the following conditions
8120945Snectar * are met:
9120945Snectar *
10120945Snectar * 1. Redistributions of source code must retain the above copyright
11120945Snectar *    notice, this list of conditions and the following disclaimer.
12120945Snectar *
13120945Snectar * 2. Redistributions in binary form must reproduce the above copyright
14120945Snectar *    notice, this list of conditions and the following disclaimer in the
15120945Snectar *    documentation and/or other materials provided with the distribution.
16120945Snectar *
17120945Snectar * 3. Neither the name of KTH nor the names of its contributors may be
18120945Snectar *    used to endorse or promote products derived from this software without
19120945Snectar *    specific prior written permission.
20120945Snectar *
21120945Snectar * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY
22120945Snectar * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23120945Snectar * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24120945Snectar * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE
25120945Snectar * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26120945Snectar * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27120945Snectar * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
28120945Snectar * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
29120945Snectar * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
30120945Snectar * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
31120945Snectar * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
32120945Snectar
33120945Snectar#include "krb5_locl.h"
34120945Snectar#include <getarg.h>
35120945Snectar#include <err.h>
36120945Snectar
37178825SdfrRCSID("$Id: test_alname.c 15474 2005-06-17 04:48:02Z lha $");
38120945Snectar
39120945Snectarstatic void
40178825Sdfrtest_alname(krb5_context context, krb5_const_realm realm,
41120945Snectar	    const char *user, const char *inst,
42120945Snectar	    const char *localuser, int ok)
43120945Snectar{
44120945Snectar    krb5_principal p;
45120945Snectar    char localname[1024];
46120945Snectar    krb5_error_code ret;
47120945Snectar    char *princ;
48120945Snectar
49120945Snectar    ret = krb5_make_principal(context, &p, realm, user, inst, NULL);
50120945Snectar    if (ret)
51120945Snectar	krb5_err(context, 1, ret, "krb5_build_principal");
52120945Snectar
53120945Snectar    ret = krb5_unparse_name(context, p, &princ);
54120945Snectar    if (ret)
55120945Snectar	krb5_err(context, 1, ret, "krb5_unparse_name");
56120945Snectar
57120945Snectar    ret = krb5_aname_to_localname(context, p, sizeof(localname), localname);
58120945Snectar    krb5_free_principal(context, p);
59120945Snectar    free(princ);
60120945Snectar    if (ret) {
61120945Snectar	if (!ok)
62120945Snectar	    return;
63120945Snectar	krb5_err(context, 1, ret, "krb5_aname_to_localname: %s -> %s",
64120945Snectar		 princ, localuser);
65120945Snectar    }
66120945Snectar
67120945Snectar    if (strcmp(localname, localuser) != 0) {
68120945Snectar	if (ok)
69120945Snectar	    errx(1, "compared failed %s != %s (should have succeded)",
70120945Snectar		 localname, localuser);
71120945Snectar    } else {
72120945Snectar	if (!ok)
73120945Snectar	    errx(1, "compared failed %s == %s (should have failed)",
74120945Snectar		 localname, localuser);
75120945Snectar    }
76120945Snectar
77120945Snectar}
78120945Snectar
79120945Snectarstatic int version_flag = 0;
80120945Snectarstatic int help_flag	= 0;
81120945Snectar
82120945Snectarstatic struct getargs args[] = {
83120945Snectar    {"version",	0,	arg_flag,	&version_flag,
84120945Snectar     "print version", NULL },
85120945Snectar    {"help",	0,	arg_flag,	&help_flag,
86120945Snectar     NULL, NULL }
87120945Snectar};
88120945Snectar
89120945Snectarstatic void
90120945Snectarusage (int ret)
91120945Snectar{
92120945Snectar    arg_printusage (args,
93120945Snectar		    sizeof(args)/sizeof(*args),
94120945Snectar		    NULL,
95120945Snectar		    "");
96120945Snectar    exit (ret);
97120945Snectar}
98120945Snectar
99120945Snectarint
100120945Snectarmain(int argc, char **argv)
101120945Snectar{
102120945Snectar    krb5_context context;
103120945Snectar    krb5_error_code ret;
104120945Snectar    krb5_realm realm;
105178825Sdfr    int optidx = 0;
106120945Snectar    char *user;
107120945Snectar
108120945Snectar    setprogname(argv[0]);
109120945Snectar
110178825Sdfr    if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx))
111120945Snectar	usage(1);
112120945Snectar
113120945Snectar    if (help_flag)
114120945Snectar	usage (0);
115120945Snectar
116120945Snectar    if(version_flag){
117120945Snectar	print_version(NULL);
118120945Snectar	exit(0);
119120945Snectar    }
120120945Snectar
121178825Sdfr    argc -= optidx;
122178825Sdfr    argv += optidx;
123120945Snectar
124120945Snectar    if (argc != 1)
125120945Snectar	errx(1, "first argument should be a local user that in root .k5login");
126120945Snectar
127120945Snectar    user = argv[0];
128120945Snectar
129120945Snectar    ret = krb5_init_context(&context);
130120945Snectar    if (ret)
131120945Snectar	errx (1, "krb5_init_context failed: %d", ret);
132120945Snectar
133120945Snectar    ret = krb5_get_default_realm(context, &realm);
134120945Snectar    if (ret)
135120945Snectar	krb5_err(context, 1, ret, "krb5_get_default_realm");
136120945Snectar
137120945Snectar    test_alname(context, realm, user, NULL, user, 1);
138120945Snectar    test_alname(context, realm, user, "root", "root", 1);
139120945Snectar
140120945Snectar    test_alname(context, "FOO.BAR.BAZ.KAKA", user, NULL, user, 0);
141120945Snectar    test_alname(context, "FOO.BAR.BAZ.KAKA", user, "root", "root", 0);
142120945Snectar
143120945Snectar    test_alname(context, realm, user, NULL,
144120945Snectar		"not-same-as-user", 0);
145120945Snectar    test_alname(context, realm, user, "root",
146120945Snectar		"not-same-as-user", 0);
147120945Snectar
148120945Snectar    test_alname(context, "FOO.BAR.BAZ.KAKA", user, NULL,
149120945Snectar		"not-same-as-user", 0);
150120945Snectar    test_alname(context, "FOO.BAR.BAZ.KAKA", user, "root",
151120945Snectar		"not-same-as-user", 0);
152120945Snectar
153120945Snectar    krb5_free_context(context);
154120945Snectar
155120945Snectar    return 0;
156120945Snectar}
157