1bbd80c28SJacques Vidrine /* 2bbd80c28SJacques Vidrine * Copyright (c) 2003 Kungliga Tekniska H�gskolan 3bbd80c28SJacques Vidrine * (Royal Institute of Technology, Stockholm, Sweden). 4bbd80c28SJacques Vidrine * All rights reserved. 5bbd80c28SJacques Vidrine * 6bbd80c28SJacques Vidrine * Redistribution and use in source and binary forms, with or without 7bbd80c28SJacques Vidrine * modification, are permitted provided that the following conditions 8bbd80c28SJacques Vidrine * are met: 9bbd80c28SJacques Vidrine * 10bbd80c28SJacques Vidrine * 1. Redistributions of source code must retain the above copyright 11bbd80c28SJacques Vidrine * notice, this list of conditions and the following disclaimer. 12bbd80c28SJacques Vidrine * 13bbd80c28SJacques Vidrine * 2. Redistributions in binary form must reproduce the above copyright 14bbd80c28SJacques Vidrine * notice, this list of conditions and the following disclaimer in the 15bbd80c28SJacques Vidrine * documentation and/or other materials provided with the distribution. 16bbd80c28SJacques Vidrine * 17bbd80c28SJacques Vidrine * 3. Neither the name of KTH nor the names of its contributors may be 18bbd80c28SJacques Vidrine * used to endorse or promote products derived from this software without 19bbd80c28SJacques Vidrine * specific prior written permission. 20bbd80c28SJacques Vidrine * 21bbd80c28SJacques Vidrine * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY 22bbd80c28SJacques Vidrine * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23bbd80c28SJacques Vidrine * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 24bbd80c28SJacques Vidrine * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE 25bbd80c28SJacques Vidrine * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 26bbd80c28SJacques Vidrine * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 27bbd80c28SJacques Vidrine * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 28bbd80c28SJacques Vidrine * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 29bbd80c28SJacques Vidrine * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 30bbd80c28SJacques Vidrine * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 31bbd80c28SJacques Vidrine * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ 32bbd80c28SJacques Vidrine 33bbd80c28SJacques Vidrine #include "krb5_locl.h" 34bbd80c28SJacques Vidrine #include <getarg.h> 35bbd80c28SJacques Vidrine #include <err.h> 36bbd80c28SJacques Vidrine 37bbd80c28SJacques Vidrine RCSID("$Id: test_alname.c,v 1.4 2003/04/17 05:46:45 lha Exp $"); 38bbd80c28SJacques Vidrine 39bbd80c28SJacques Vidrine static void 40bbd80c28SJacques Vidrine test_alname(krb5_context context, krb5_realm realm, 41bbd80c28SJacques Vidrine const char *user, const char *inst, 42bbd80c28SJacques Vidrine const char *localuser, int ok) 43bbd80c28SJacques Vidrine { 44bbd80c28SJacques Vidrine krb5_principal p; 45bbd80c28SJacques Vidrine char localname[1024]; 46bbd80c28SJacques Vidrine krb5_error_code ret; 47bbd80c28SJacques Vidrine char *princ; 48bbd80c28SJacques Vidrine 49bbd80c28SJacques Vidrine ret = krb5_make_principal(context, &p, realm, user, inst, NULL); 50bbd80c28SJacques Vidrine if (ret) 51bbd80c28SJacques Vidrine krb5_err(context, 1, ret, "krb5_build_principal"); 52bbd80c28SJacques Vidrine 53bbd80c28SJacques Vidrine ret = krb5_unparse_name(context, p, &princ); 54bbd80c28SJacques Vidrine if (ret) 55bbd80c28SJacques Vidrine krb5_err(context, 1, ret, "krb5_unparse_name"); 56bbd80c28SJacques Vidrine 57bbd80c28SJacques Vidrine ret = krb5_aname_to_localname(context, p, sizeof(localname), localname); 58bbd80c28SJacques Vidrine krb5_free_principal(context, p); 59bbd80c28SJacques Vidrine free(princ); 60bbd80c28SJacques Vidrine if (ret) { 61bbd80c28SJacques Vidrine if (!ok) 62bbd80c28SJacques Vidrine return; 63bbd80c28SJacques Vidrine krb5_err(context, 1, ret, "krb5_aname_to_localname: %s -> %s", 64bbd80c28SJacques Vidrine princ, localuser); 65bbd80c28SJacques Vidrine } 66bbd80c28SJacques Vidrine 67bbd80c28SJacques Vidrine if (strcmp(localname, localuser) != 0) { 68bbd80c28SJacques Vidrine if (ok) 69bbd80c28SJacques Vidrine errx(1, "compared failed %s != %s (should have succeded)", 70bbd80c28SJacques Vidrine localname, localuser); 71bbd80c28SJacques Vidrine } else { 72bbd80c28SJacques Vidrine if (!ok) 73bbd80c28SJacques Vidrine errx(1, "compared failed %s == %s (should have failed)", 74bbd80c28SJacques Vidrine localname, localuser); 75bbd80c28SJacques Vidrine } 76bbd80c28SJacques Vidrine 77bbd80c28SJacques Vidrine } 78bbd80c28SJacques Vidrine 79bbd80c28SJacques Vidrine static int version_flag = 0; 80bbd80c28SJacques Vidrine static int help_flag = 0; 81bbd80c28SJacques Vidrine 82bbd80c28SJacques Vidrine static struct getargs args[] = { 83bbd80c28SJacques Vidrine {"version", 0, arg_flag, &version_flag, 84bbd80c28SJacques Vidrine "print version", NULL }, 85bbd80c28SJacques Vidrine {"help", 0, arg_flag, &help_flag, 86bbd80c28SJacques Vidrine NULL, NULL } 87bbd80c28SJacques Vidrine }; 88bbd80c28SJacques Vidrine 89bbd80c28SJacques Vidrine static void 90bbd80c28SJacques Vidrine usage (int ret) 91bbd80c28SJacques Vidrine { 92bbd80c28SJacques Vidrine arg_printusage (args, 93bbd80c28SJacques Vidrine sizeof(args)/sizeof(*args), 94bbd80c28SJacques Vidrine NULL, 95bbd80c28SJacques Vidrine ""); 96bbd80c28SJacques Vidrine exit (ret); 97bbd80c28SJacques Vidrine } 98bbd80c28SJacques Vidrine 99bbd80c28SJacques Vidrine int 100bbd80c28SJacques Vidrine main(int argc, char **argv) 101bbd80c28SJacques Vidrine { 102bbd80c28SJacques Vidrine krb5_context context; 103bbd80c28SJacques Vidrine krb5_error_code ret; 104bbd80c28SJacques Vidrine krb5_realm realm; 105bbd80c28SJacques Vidrine int optind = 0; 106bbd80c28SJacques Vidrine char *user; 107bbd80c28SJacques Vidrine 108bbd80c28SJacques Vidrine setprogname(argv[0]); 109bbd80c28SJacques Vidrine 110bbd80c28SJacques Vidrine if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optind)) 111bbd80c28SJacques Vidrine usage(1); 112bbd80c28SJacques Vidrine 113bbd80c28SJacques Vidrine if (help_flag) 114bbd80c28SJacques Vidrine usage (0); 115bbd80c28SJacques Vidrine 116bbd80c28SJacques Vidrine if(version_flag){ 117bbd80c28SJacques Vidrine print_version(NULL); 118bbd80c28SJacques Vidrine exit(0); 119bbd80c28SJacques Vidrine } 120bbd80c28SJacques Vidrine 121bbd80c28SJacques Vidrine argc -= optind; 122bbd80c28SJacques Vidrine argv += optind; 123bbd80c28SJacques Vidrine 124bbd80c28SJacques Vidrine if (argc != 1) 125bbd80c28SJacques Vidrine errx(1, "first argument should be a local user that in root .k5login"); 126bbd80c28SJacques Vidrine 127bbd80c28SJacques Vidrine user = argv[0]; 128bbd80c28SJacques Vidrine 129bbd80c28SJacques Vidrine ret = krb5_init_context(&context); 130bbd80c28SJacques Vidrine if (ret) 131bbd80c28SJacques Vidrine errx (1, "krb5_init_context failed: %d", ret); 132bbd80c28SJacques Vidrine 133bbd80c28SJacques Vidrine ret = krb5_get_default_realm(context, &realm); 134bbd80c28SJacques Vidrine if (ret) 135bbd80c28SJacques Vidrine krb5_err(context, 1, ret, "krb5_get_default_realm"); 136bbd80c28SJacques Vidrine 137bbd80c28SJacques Vidrine test_alname(context, realm, user, NULL, user, 1); 138bbd80c28SJacques Vidrine test_alname(context, realm, user, "root", "root", 1); 139bbd80c28SJacques Vidrine 140bbd80c28SJacques Vidrine test_alname(context, "FOO.BAR.BAZ.KAKA", user, NULL, user, 0); 141bbd80c28SJacques Vidrine test_alname(context, "FOO.BAR.BAZ.KAKA", user, "root", "root", 0); 142bbd80c28SJacques Vidrine 143bbd80c28SJacques Vidrine test_alname(context, realm, user, NULL, 144bbd80c28SJacques Vidrine "not-same-as-user", 0); 145bbd80c28SJacques Vidrine test_alname(context, realm, user, "root", 146bbd80c28SJacques Vidrine "not-same-as-user", 0); 147bbd80c28SJacques Vidrine 148bbd80c28SJacques Vidrine test_alname(context, "FOO.BAR.BAZ.KAKA", user, NULL, 149bbd80c28SJacques Vidrine "not-same-as-user", 0); 150bbd80c28SJacques Vidrine test_alname(context, "FOO.BAR.BAZ.KAKA", user, "root", 151bbd80c28SJacques Vidrine "not-same-as-user", 0); 152bbd80c28SJacques Vidrine 153bbd80c28SJacques Vidrine krb5_free_context(context); 154bbd80c28SJacques Vidrine 155bbd80c28SJacques Vidrine return 0; 156bbd80c28SJacques Vidrine } 157