From 37bcf8ded8d57a0698f1ce0bb2fbcbccc50d066d Mon Sep 17 00:00:00 2001 From: Johan Danielsson Date: Fri, 15 Dec 2000 17:44:49 +0000 Subject: [PATCH] merge srvconvert with copy git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@9404 ec53bebd-3082-4978-b11e-865c3cabbd6b --- admin/Makefile.am | 1 - admin/copy.c | 148 ++++++++++++++++++++++++------------ admin/srvconvert.c | 181 --------------------------------------------- 3 files changed, 102 insertions(+), 228 deletions(-) delete mode 100644 admin/srvconvert.c diff --git a/admin/Makefile.am b/admin/Makefile.am index fe937fc88..7594f6ef1 100644 --- a/admin/Makefile.am +++ b/admin/Makefile.am @@ -16,7 +16,6 @@ ktutil_SOURCES = add.c \ list.c \ purge.c \ remove.c \ - srvconvert.c \ srvcreate.c LDADD = \ diff --git a/admin/copy.c b/admin/copy.c index ecea49406..3893cebac 100644 --- a/admin/copy.c +++ b/admin/copy.c @@ -35,16 +35,61 @@ RCSID("$Id$"); -int -kt_copy (int argc, char **argv) +static int +kt_copy_int (const char *from, const char *to) { krb5_error_code ret; - int help_flag = 0; - int optind = 0; krb5_keytab src_keytab, dst_keytab; krb5_kt_cursor cursor; krb5_keytab_entry entry; + ret = krb5_kt_resolve (context, from, &src_keytab); + if (ret) { + krb5_warn (context, ret, "resolving src keytab `%s'", from); + return 0; + } + + ret = krb5_kt_resolve (context, to, &dst_keytab); + if (ret) { + krb5_kt_close (context, src_keytab); + krb5_warn (context, ret, "resolving dst keytab `%s'", to); + return 0; + } + + ret = krb5_kt_start_seq_get (context, src_keytab, &cursor); + if (ret) { + krb5_warn (context, ret, "krb5_kt_start_seq_get %s", keytab_string); + goto fail; + } + + while((ret = krb5_kt_next_entry(context, src_keytab, + &entry, &cursor)) == 0) { + char name_str[128]; + krb5_unparse_name_fixed (context, entry.principal, + name_str, sizeof(name_str)); + if (verbose_flag) + printf ("copying %s\n", name_str); + ret = krb5_kt_add_entry (context, dst_keytab, &entry); + krb5_kt_free_entry (context, &entry); + if (ret) { + krb5_warn (context, ret, "krb5_kt_add_entry(%s)", name_str); + break; + } + } + krb5_kt_end_seq_get (context, src_keytab, &cursor); + +fail: + krb5_kt_close (context, src_keytab); + krb5_kt_close (context, dst_keytab); + return 0; +} + +int +kt_copy (int argc, char **argv) +{ + int help_flag = 0; + int optind = 0; + struct getargs args[] = { { "help", 'h', arg_flag, NULL} }; @@ -53,6 +98,7 @@ kt_copy (int argc, char **argv) int i = 0; args[i++].value = &help_flag; + args[i++].value = &verbose_flag; if(getarg(args, num_args, argc, argv, &optind)) { arg_printusage(args, num_args, "ktutil copy", @@ -74,46 +120,56 @@ kt_copy (int argc, char **argv) return 0; } - ret = krb5_kt_resolve (context, argv[0], &src_keytab); - if (ret) { - krb5_warn (context, ret, "resolving src keytab `%s'", argv[0]); - return 0; - } - - ret = krb5_kt_resolve (context, argv[1], &dst_keytab); - if (ret) { - krb5_kt_close (context, src_keytab); - krb5_warn (context, ret, "resolving dst keytab `%s'", argv[1]); - return 0; - } - - ret = krb5_kt_start_seq_get (context, src_keytab, &cursor); - if (ret) { - krb5_warn (context, ret, "krb5_kt_start_seq_get %s", keytab_string); - goto fail; - } - - while((ret = krb5_kt_next_entry(context, src_keytab, - &entry, &cursor)) == 0) { - ret = krb5_kt_add_entry (context, dst_keytab, &entry); - if (verbose_flag) { - char *name_str; - - krb5_unparse_name (context, entry.principal, &name_str); - printf ("copying %s\n", name_str); - free (name_str); - } - - krb5_kt_free_entry (context, &entry); - if (ret) { - krb5_warn (context, ret, "krb5_kt_add_entry"); - break; - } - } - krb5_kt_end_seq_get (context, src_keytab, &cursor); - -fail: - krb5_kt_close (context, src_keytab); - krb5_kt_close (context, dst_keytab); - return 0; + return kt_copy_int(argv[0], argv[1]); +} + +/* convert a version 4 srvtab to a version 5 keytab */ + +#ifndef KEYFILE +#define KEYFILE "/etc/srvtab" +#endif + +int +srvconv(int argc, char **argv) +{ + int help_flag = 0; + char *srvtab = KEYFILE; + int optind = 0; + char kt4[1024], kt5[1024]; + + struct getargs args[] = { + { "srvtab", 's', arg_string, NULL}, + { "help", 'h', arg_flag, NULL} + }; + + int num_args = sizeof(args) / sizeof(args[0]); + int i = 0; + + args[i++].value = &srvtab; + args[i++].value = &help_flag; + + if(getarg(args, num_args, argc, argv, &optind)){ + arg_printusage(args, num_args, "ktutil srvconvert", ""); + return 1; + } + if(help_flag){ + arg_printusage(args, num_args, "ktutil srvconvert", ""); + return 0; + } + + argc -= optind; + argv += optind; + + if (argc != 0) { + arg_printusage(args, num_args, "ktutil srvconvert", ""); + return 1; + } + + snprintf(kt4, sizeof(kt4), "krb4:%s", srvtab); + + if(keytab_string != NULL) + return kt_copy_int(kt4, keytab_string); + + krb5_kt_default_name(context, kt5, sizeof(kt5)); + return kt_copy_int(kt4, kt5); } diff --git a/admin/srvconvert.c b/admin/srvconvert.c deleted file mode 100644 index 4832eeca3..000000000 --- a/admin/srvconvert.c +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright (c) 1997 - 2000 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden). - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * 3. Neither the name of the Institute nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "ktutil_locl.h" - -RCSID("$Id$"); - -/* convert a version 4 srvtab to a version 5 keytab */ - -#ifndef KEYFILE -#define KEYFILE "/etc/srvtab" -#endif - -static char *srvtab = KEYFILE; -static int help_flag; -static int verbose; - -static struct getargs args[] = { - { "srvtab", 's', arg_string, &srvtab, "srvtab to convert", "file" }, - { "help", 'h', arg_flag, &help_flag }, - { "verbose", 'v', arg_flag, &verbose }, -}; - -static int num_args = sizeof(args) / sizeof(args[0]); - -int -srvconv(int argc, char **argv) -{ - krb5_error_code ret; - int optind = 0; - int fd; - krb5_storage *sp; - - if(getarg(args, num_args, argc, argv, &optind)){ - arg_printusage(args, num_args, "ktutil srvconvert", ""); - return 1; - } - if(help_flag){ - arg_printusage(args, num_args, "ktutil srvconvert", ""); - return 0; - } - - argc -= optind; - argv += optind; - - if (argc != 0) { - arg_printusage(args, num_args, "ktutil srvconvert", ""); - return 1; - } - - fd = open(srvtab, O_RDONLY); - if(fd < 0){ - krb5_warn(context, errno, "%s", srvtab); - return 1; - } - sp = krb5_storage_from_fd(fd); - if(sp == NULL){ - close(fd); - return 1; - } - while(1){ - char *service, *instance, *realm; - int8_t kvno; - des_cblock key; - krb5_keytab_entry entry; - - ret = krb5_ret_stringz(sp, &service); - if(ret == KRB5_CC_END) { - ret = 0; - break; - } - if(ret) { - krb5_warn(context, ret, "reading service"); - break; - } - ret = krb5_ret_stringz(sp, &instance); - if(ret) { - krb5_warn(context, ret, "reading instance"); - free(service); - break; - } - ret = krb5_ret_stringz(sp, &realm); - if(ret) { - krb5_warn(context, ret, "reading realm"); - free(service); - free(instance); - break; - } - ret = krb5_425_conv_principal(context, service, instance, realm, - &entry.principal); - if (ret) - krb5_warn(context, ret, "krb5_425_conv_principal (%s.%s@%s)", - service, instance, realm); - free(service); - free(instance); - free(realm); - if (ret) - break; - - ret = krb5_ret_int8(sp, &kvno); - if(ret) { - krb5_warn(context, ret, "reading kvno"); - krb5_free_principal(context, entry.principal); - break; - } - ret = sp->fetch(sp, key, 8); - if(ret < 0){ - krb5_warn(context, errno, "reading key"); - krb5_free_principal(context, entry.principal); - break; - } - if(ret < 8) { - krb5_warn(context, errno, "end of file while reading key"); - krb5_free_principal(context, entry.principal); - break; - } - - entry.vno = kvno; - entry.timestamp = time (NULL); - entry.keyblock.keyvalue.data = key; - entry.keyblock.keyvalue.length = 8; - - if(verbose){ - char *p; - ret = krb5_unparse_name(context, entry.principal, &p); - if(ret){ - krb5_warn(context, ret, "krb5_unparse_name"); - krb5_free_principal(context, entry.principal); - break; - } else{ - fprintf(stderr, "Storing keytab for %s\n", p); - free(p); - } - - } - entry.keyblock.keytype = ETYPE_DES_CBC_MD5; - ret = krb5_kt_add_entry(context, keytab, &entry); - entry.keyblock.keytype = ETYPE_DES_CBC_MD4; - ret = krb5_kt_add_entry(context, keytab, &entry); - entry.keyblock.keytype = ETYPE_DES_CBC_CRC; - ret = krb5_kt_add_entry(context, keytab, &entry); - krb5_free_principal(context, entry.principal); - if(ret) { - krb5_warn(context, ret, "krb5_kt_add_entry"); - break; - } - } - krb5_storage_free(sp); - close(fd); - return ret; -}