merge srvconvert with copy
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@9404 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
		| @@ -16,7 +16,6 @@ ktutil_SOURCES = add.c				\ | ||||
| 		 list.c				\ | ||||
| 		 purge.c			\ | ||||
| 		 remove.c			\ | ||||
| 		 srvconvert.c			\ | ||||
| 		 srvcreate.c | ||||
|  | ||||
| LDADD = \ | ||||
|   | ||||
							
								
								
									
										148
									
								
								admin/copy.c
									
									
									
									
									
								
							
							
						
						
									
										148
									
								
								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); | ||||
| } | ||||
|   | ||||
| @@ -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; | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Johan Danielsson
					Johan Danielsson