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				\ | 		 list.c				\ | ||||||
| 		 purge.c			\ | 		 purge.c			\ | ||||||
| 		 remove.c			\ | 		 remove.c			\ | ||||||
| 		 srvconvert.c			\ |  | ||||||
| 		 srvcreate.c | 		 srvcreate.c | ||||||
|  |  | ||||||
| LDADD = \ | LDADD = \ | ||||||
|   | |||||||
							
								
								
									
										134
									
								
								admin/copy.c
									
									
									
									
									
								
							
							
						
						
									
										134
									
								
								admin/copy.c
									
									
									
									
									
								
							| @@ -35,16 +35,61 @@ | |||||||
|  |  | ||||||
| RCSID("$Id$"); | RCSID("$Id$"); | ||||||
|  |  | ||||||
| int | static int | ||||||
| kt_copy (int argc, char **argv) | kt_copy_int (const char *from, const char *to) | ||||||
| { | { | ||||||
|     krb5_error_code ret; |     krb5_error_code ret; | ||||||
|     int help_flag = 0; |  | ||||||
|     int optind = 0; |  | ||||||
|     krb5_keytab src_keytab, dst_keytab; |     krb5_keytab src_keytab, dst_keytab; | ||||||
|     krb5_kt_cursor cursor; |     krb5_kt_cursor cursor; | ||||||
|     krb5_keytab_entry entry; |     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[] = { |     struct getargs args[] = { | ||||||
| 	{ "help", 'h', arg_flag, NULL} | 	{ "help", 'h', arg_flag, NULL} | ||||||
|     }; |     }; | ||||||
| @@ -53,6 +98,7 @@ kt_copy (int argc, char **argv) | |||||||
|     int i = 0; |     int i = 0; | ||||||
|  |  | ||||||
|     args[i++].value = &help_flag; |     args[i++].value = &help_flag; | ||||||
|  |     args[i++].value = &verbose_flag; | ||||||
|  |  | ||||||
|     if(getarg(args, num_args, argc, argv, &optind)) { |     if(getarg(args, num_args, argc, argv, &optind)) { | ||||||
| 	arg_printusage(args, num_args, "ktutil copy", | 	arg_printusage(args, num_args, "ktutil copy", | ||||||
| @@ -74,46 +120,56 @@ kt_copy (int argc, char **argv) | |||||||
| 	return 0; | 	return 0; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     ret = krb5_kt_resolve (context, argv[0], &src_keytab); |     return kt_copy_int(argv[0], argv[1]); | ||||||
|     if (ret) { | } | ||||||
| 	krb5_warn (context, ret, "resolving src keytab `%s'", argv[0]); |  | ||||||
|  | /* 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; | 	return 0; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     ret = krb5_kt_resolve (context, argv[1], &dst_keytab); |     argc -= optind; | ||||||
|     if (ret) { |     argv += optind; | ||||||
| 	krb5_kt_close (context, src_keytab); |  | ||||||
| 	krb5_warn (context, ret, "resolving dst keytab `%s'", argv[1]); |     if (argc != 0) { | ||||||
| 	return 0; | 	arg_printusage(args, num_args, "ktutil srvconvert", ""); | ||||||
|  | 	return 1; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     ret = krb5_kt_start_seq_get (context, src_keytab, &cursor); |     snprintf(kt4, sizeof(kt4), "krb4:%s", srvtab); | ||||||
|     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, |     if(keytab_string != NULL) | ||||||
| 				    &entry, &cursor)) == 0) { | 	return kt_copy_int(kt4, keytab_string); | ||||||
| 	ret = krb5_kt_add_entry (context, dst_keytab, &entry); |  | ||||||
| 	if (verbose_flag) { |  | ||||||
| 	    char *name_str; |  | ||||||
|  |  | ||||||
| 	    krb5_unparse_name (context, entry.principal, &name_str); |     krb5_kt_default_name(context, kt5, sizeof(kt5)); | ||||||
| 	    printf ("copying %s\n", name_str); |     return kt_copy_int(kt4, kt5); | ||||||
| 	    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; |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -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