1120945Snectar/*
2233294Sstas * Copyright (c) 2003 Kungliga Tekniska H��gskolan
3233294Sstas * (Royal Institute of Technology, Stockholm, Sweden).
4233294Sstas * All rights reserved.
5120945Snectar *
6233294Sstas * Redistribution and use in source and binary forms, with or without
7233294Sstas * modification, are permitted provided that the following conditions
8233294Sstas * are met:
9120945Snectar *
10233294Sstas * 1. Redistributions of source code must retain the above copyright
11233294Sstas *    notice, this list of conditions and the following disclaimer.
12120945Snectar *
13233294Sstas * 2. Redistributions in binary form must reproduce the above copyright
14233294Sstas *    notice, this list of conditions and the following disclaimer in the
15233294Sstas *    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
37120945Snectarstatic void
38178825Sdfrtest_alname(krb5_context context, krb5_const_realm realm,
39233294Sstas	    const char *user, const char *inst,
40120945Snectar	    const char *localuser, int ok)
41120945Snectar{
42120945Snectar    krb5_principal p;
43120945Snectar    char localname[1024];
44120945Snectar    krb5_error_code ret;
45120945Snectar    char *princ;
46120945Snectar
47120945Snectar    ret = krb5_make_principal(context, &p, realm, user, inst, NULL);
48120945Snectar    if (ret)
49120945Snectar	krb5_err(context, 1, ret, "krb5_build_principal");
50120945Snectar
51120945Snectar    ret = krb5_unparse_name(context, p, &princ);
52120945Snectar    if (ret)
53120945Snectar	krb5_err(context, 1, ret, "krb5_unparse_name");
54120945Snectar
55120945Snectar    ret = krb5_aname_to_localname(context, p, sizeof(localname), localname);
56120945Snectar    krb5_free_principal(context, p);
57120945Snectar    free(princ);
58120945Snectar    if (ret) {
59120945Snectar	if (!ok)
60120945Snectar	    return;
61233294Sstas	krb5_err(context, 1, ret, "krb5_aname_to_localname: %s -> %s",
62120945Snectar		 princ, localuser);
63120945Snectar    }
64120945Snectar
65120945Snectar    if (strcmp(localname, localuser) != 0) {
66120945Snectar	if (ok)
67233294Sstas	    errx(1, "compared failed %s != %s (should have succeded)",
68120945Snectar		 localname, localuser);
69120945Snectar    } else {
70120945Snectar	if (!ok)
71233294Sstas	    errx(1, "compared failed %s == %s (should have failed)",
72120945Snectar		 localname, localuser);
73120945Snectar    }
74233294Sstas
75120945Snectar}
76120945Snectar
77120945Snectarstatic int version_flag = 0;
78120945Snectarstatic int help_flag	= 0;
79120945Snectar
80120945Snectarstatic struct getargs args[] = {
81120945Snectar    {"version",	0,	arg_flag,	&version_flag,
82120945Snectar     "print version", NULL },
83120945Snectar    {"help",	0,	arg_flag,	&help_flag,
84120945Snectar     NULL, NULL }
85120945Snectar};
86120945Snectar
87120945Snectarstatic void
88120945Snectarusage (int ret)
89120945Snectar{
90120945Snectar    arg_printusage (args,
91120945Snectar		    sizeof(args)/sizeof(*args),
92120945Snectar		    NULL,
93120945Snectar		    "");
94120945Snectar    exit (ret);
95120945Snectar}
96120945Snectar
97120945Snectarint
98120945Snectarmain(int argc, char **argv)
99120945Snectar{
100120945Snectar    krb5_context context;
101120945Snectar    krb5_error_code ret;
102120945Snectar    krb5_realm realm;
103178825Sdfr    int optidx = 0;
104120945Snectar    char *user;
105120945Snectar
106120945Snectar    setprogname(argv[0]);
107120945Snectar
108178825Sdfr    if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx))
109120945Snectar	usage(1);
110233294Sstas
111120945Snectar    if (help_flag)
112120945Snectar	usage (0);
113120945Snectar
114120945Snectar    if(version_flag){
115120945Snectar	print_version(NULL);
116120945Snectar	exit(0);
117120945Snectar    }
118120945Snectar
119178825Sdfr    argc -= optidx;
120178825Sdfr    argv += optidx;
121120945Snectar
122120945Snectar    if (argc != 1)
123120945Snectar	errx(1, "first argument should be a local user that in root .k5login");
124120945Snectar
125120945Snectar    user = argv[0];
126120945Snectar
127120945Snectar    ret = krb5_init_context(&context);
128120945Snectar    if (ret)
129120945Snectar	errx (1, "krb5_init_context failed: %d", ret);
130120945Snectar
131120945Snectar    ret = krb5_get_default_realm(context, &realm);
132120945Snectar    if (ret)
133120945Snectar	krb5_err(context, 1, ret, "krb5_get_default_realm");
134120945Snectar
135120945Snectar    test_alname(context, realm, user, NULL, user, 1);
136120945Snectar    test_alname(context, realm, user, "root", "root", 1);
137120945Snectar
138120945Snectar    test_alname(context, "FOO.BAR.BAZ.KAKA", user, NULL, user, 0);
139120945Snectar    test_alname(context, "FOO.BAR.BAZ.KAKA", user, "root", "root", 0);
140120945Snectar
141233294Sstas    test_alname(context, realm, user, NULL,
142120945Snectar		"not-same-as-user", 0);
143120945Snectar    test_alname(context, realm, user, "root",
144120945Snectar		"not-same-as-user", 0);
145120945Snectar
146233294Sstas    test_alname(context, "FOO.BAR.BAZ.KAKA", user, NULL,
147120945Snectar		"not-same-as-user", 0);
148120945Snectar    test_alname(context, "FOO.BAR.BAZ.KAKA", user, "root",
149120945Snectar		"not-same-as-user", 0);
150120945Snectar
151120945Snectar    krb5_free_context(context);
152120945Snectar
153120945Snectar    return 0;
154120945Snectar}
155