move ticket conversion code to separate function, and call that from a
couple of places, like when renewing a ticket; also add a flag for just converting a ticket git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@10203 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
		
							
								
								
									
										311
									
								
								kuser/kinit.c
									
									
									
									
									
								
							
							
						
						
									
										311
									
								
								kuser/kinit.c
									
									
									
									
									
								
							| @@ -179,6 +179,7 @@ char *keytab_str	= NULL; | |||||||
| #ifdef KRB4 | #ifdef KRB4 | ||||||
| extern int do_afslog; | extern int do_afslog; | ||||||
| extern int get_v4_tgt; | extern int get_v4_tgt; | ||||||
|  | int convert_524; | ||||||
| #endif | #endif | ||||||
| int fcache_version; | int fcache_version; | ||||||
|  |  | ||||||
| @@ -187,6 +188,9 @@ static struct getargs args[] = { | |||||||
|     { "524init", 	'4', arg_flag, &get_v4_tgt, |     { "524init", 	'4', arg_flag, &get_v4_tgt, | ||||||
|       "obtain version 4 TGT" }, |       "obtain version 4 TGT" }, | ||||||
|      |      | ||||||
|  |     { "524convert", 	'9', arg_flag, &convert_524, | ||||||
|  |       "only convert ticket to version 4" }, | ||||||
|  |      | ||||||
|     { "afslog", 	0  , arg_flag, &do_afslog, |     { "afslog", 	0  , arg_flag, &do_afslog, | ||||||
|       "obtain afs tokens"  }, |       "obtain afs tokens"  }, | ||||||
| #endif | #endif | ||||||
| @@ -252,6 +256,56 @@ usage (int ret) | |||||||
|     exit (ret); |     exit (ret); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static krb5_error_code | ||||||
|  | get_server(krb5_context context, | ||||||
|  | 	   krb5_principal client, | ||||||
|  | 	   const char *server, | ||||||
|  | 	   krb5_principal *princ) | ||||||
|  | { | ||||||
|  |     krb5_realm *client_realm; | ||||||
|  |     if(server) | ||||||
|  | 	return krb5_parse_name(context, server, princ); | ||||||
|  |  | ||||||
|  |     client_realm = krb5_princ_realm (context, client); | ||||||
|  |     return krb5_make_principal(context, princ, *client_realm, | ||||||
|  | 			       KRB5_TGS_NAME, *client_realm, NULL); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static krb5_error_code | ||||||
|  | do_524init(krb5_context context, krb5_ccache ccache,  | ||||||
|  | 	   krb5_creds *creds, const char *server) | ||||||
|  | { | ||||||
|  |     krb5_error_code ret; | ||||||
|  |     CREDENTIALS c; | ||||||
|  |     krb5_creds in_creds, *real_creds; | ||||||
|  |  | ||||||
|  |     if(creds != NULL) | ||||||
|  | 	real_creds = creds; | ||||||
|  |     else { | ||||||
|  | 	krb5_principal client; | ||||||
|  | 	krb5_cc_get_principal(context, ccache, &client); | ||||||
|  | 	memset(&in_creds, 0, sizeof(in_creds)); | ||||||
|  | 	ret = get_server(context, client, server, &in_creds.server); | ||||||
|  | 	ret = krb5_get_credentials(context, 0, ccache, &in_creds, &real_creds); | ||||||
|  | 	if(ret) | ||||||
|  | 	    return ret; | ||||||
|  |     } | ||||||
|  |     ret = krb524_convert_creds_kdc_ccache(context, ccache, real_creds, &c); | ||||||
|  |     if(ret) | ||||||
|  | 	krb5_warn(context, ret, "converting creds"); | ||||||
|  |     else { | ||||||
|  | 	int tret = tf_setup(&c, c.pname, c.pinst); | ||||||
|  | 	if(tret) | ||||||
|  | 	    krb5_warnx(context, "saving v4 creds: %s", krb_get_err_text(tret)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if(creds == NULL) | ||||||
|  | 	krb5_free_creds(context, real_creds); | ||||||
|  |     memset(&c, 0, sizeof(c)); | ||||||
|  |  | ||||||
|  |     return ret; | ||||||
|  | } | ||||||
|  |  | ||||||
| static int | static int | ||||||
| renew_validate(krb5_context context,  | renew_validate(krb5_context context,  | ||||||
| 	       int renew, | 	       int renew, | ||||||
| @@ -317,6 +371,18 @@ renew_validate(krb5_context context, | |||||||
| 	goto out; | 	goto out; | ||||||
|     } |     } | ||||||
|     ret = krb5_cc_store_cred(context, cache, out); |     ret = krb5_cc_store_cred(context, cache, out); | ||||||
|  |  | ||||||
|  | #ifdef KRB4 | ||||||
|  |     if(ret != 0 && server == NULL) { | ||||||
|  | 	/* only do this if it's a general renew-my-tgt request */ | ||||||
|  | 	if(get_v4_tgt) | ||||||
|  | 	    do_524init(context, cache, out, NULL); | ||||||
|  |  | ||||||
|  | 	if(do_afslog && k_hasafs()) | ||||||
|  | 	    krb5_afslog(context, cache, NULL, NULL); | ||||||
|  |     } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|     krb5_free_creds (context, out); |     krb5_free_creds (context, out); | ||||||
|     if(ret) { |     if(ret) { | ||||||
| 	krb5_warn(context, ret, "krb5_cc_store_cred"); | 	krb5_warn(context, ret, "krb5_cc_store_cred"); | ||||||
| @@ -327,109 +393,21 @@ out: | |||||||
|     return ret; |     return ret; | ||||||
| } | } | ||||||
|  |  | ||||||
| int | static krb5_error_code | ||||||
| main (int argc, char **argv) | get_new_tickets(krb5_context context,  | ||||||
|  | 		krb5_principal principal, | ||||||
|  | 		krb5_ccache ccache, | ||||||
|  | 		krb5_deltat ticket_life) | ||||||
| { | { | ||||||
|     krb5_error_code ret; |     krb5_error_code ret; | ||||||
|     krb5_context context; |  | ||||||
|     krb5_ccache  ccache; |  | ||||||
|     krb5_principal principal; |  | ||||||
|     krb5_creds cred; |  | ||||||
|     int optind = 0; |  | ||||||
|     krb5_get_init_creds_opt opt; |     krb5_get_init_creds_opt opt; | ||||||
|     krb5_deltat start_time = 0; |  | ||||||
|     krb5_deltat ticket_life = 0; |  | ||||||
|     krb5_addresses no_addrs; |     krb5_addresses no_addrs; | ||||||
|  |     krb5_creds cred; | ||||||
|     char passwd[256]; |     char passwd[256]; | ||||||
|  |     krb5_deltat start_time = 0; | ||||||
|  |  | ||||||
|     setprogname (argv[0]); |  | ||||||
|     memset(&cred, 0, sizeof(cred)); |     memset(&cred, 0, sizeof(cred)); | ||||||
|  |  | ||||||
|     ret = krb5_init_context (&context); |  | ||||||
|     if (ret) |  | ||||||
| 	errx(1, "krb5_init_context failed: %d", ret); |  | ||||||
|    |  | ||||||
|     /* XXX no way to figure out if set without explict test */ |  | ||||||
|     if(krb5_config_get_string(context, NULL, "libdefaults",  |  | ||||||
| 			      "forwardable", NULL)) |  | ||||||
| 	forwardable_flag = krb5_config_get_bool (context, NULL, |  | ||||||
| 						 "libdefaults", |  | ||||||
| 						 "forwardable", |  | ||||||
| 						 NULL); |  | ||||||
|  |  | ||||||
| #ifdef KRB4 |  | ||||||
|     get_v4_tgt = krb5_config_get_bool_default (context, NULL, |  | ||||||
| 					       get_v4_tgt, |  | ||||||
| 					       "libdefaults", |  | ||||||
| 					       "krb4_get_tickets", |  | ||||||
| 					       NULL); |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
|     if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optind)) |  | ||||||
| 	usage(1); |  | ||||||
|      |  | ||||||
|     if (help_flag) |  | ||||||
| 	usage (0); |  | ||||||
|  |  | ||||||
|     if(version_flag) { |  | ||||||
| 	print_version(NULL); |  | ||||||
| 	exit(0); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     argc -= optind; |  | ||||||
|     argv += optind; |  | ||||||
|  |  | ||||||
|     if (argv[0]) { |  | ||||||
| 	ret = krb5_parse_name (context, argv[0], &principal); |  | ||||||
| 	if (ret) |  | ||||||
| 	    krb5_err (context, 1, ret, "krb5_parse_name"); |  | ||||||
|     } else { |  | ||||||
| 	ret = kinit_get_default_principal (context, &principal); |  | ||||||
| 	if (ret) |  | ||||||
| 	    krb5_err (context, 1, ret, "krb5_get_default_principal"); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     if(fcache_version) |  | ||||||
| 	krb5_set_fcache_version(context, fcache_version); |  | ||||||
|  |  | ||||||
|     if(cred_cache)  |  | ||||||
| 	ret = krb5_cc_resolve(context, cred_cache, &ccache); |  | ||||||
|     else { |  | ||||||
| 	if(argc > 1) { |  | ||||||
| 	    char s[1024]; |  | ||||||
| 	    ret = krb5_cc_gen_new(context, &krb5_fcc_ops, &ccache); |  | ||||||
| 	    if(ret) |  | ||||||
| 		krb5_err(context, 1, ret, "creating cred cache"); |  | ||||||
| 	    snprintf(s, sizeof(s), "%s:%s", |  | ||||||
| 		     krb5_cc_get_type(context, ccache), |  | ||||||
| 		     krb5_cc_get_name(context, ccache)); |  | ||||||
| 	    setenv("KRB5CCNAME", s, 1); |  | ||||||
| #ifdef KRB4 |  | ||||||
| 	    snprintf(s, sizeof(s), "%s_XXXXXX", TKT_ROOT); |  | ||||||
| 	    close(mkstemp(s)); |  | ||||||
| 	    setenv("KRBTKFILE", s, 1); |  | ||||||
| 	    if (k_hasafs ()) |  | ||||||
| 		k_setpag(); |  | ||||||
| #endif |  | ||||||
| 	} else |  | ||||||
| 	    ret = krb5_cc_default (context, &ccache); |  | ||||||
|     } |  | ||||||
|     if (ret) |  | ||||||
| 	krb5_err (context, 1, ret, "resolving credentials cache"); |  | ||||||
|  |  | ||||||
|     if (lifetime) { |  | ||||||
| 	int tmp = parse_time (lifetime, "s"); |  | ||||||
| 	if (tmp < 0) |  | ||||||
| 	    errx (1, "unparsable time: %s", lifetime); |  | ||||||
|  |  | ||||||
| 	ticket_life = tmp; |  | ||||||
|     } |  | ||||||
|     if(renew_flag || validate_flag) { |  | ||||||
| 	ret = renew_validate(context, renew_flag, validate_flag,  |  | ||||||
| 			     ccache, server, ticket_life); |  | ||||||
| 	exit(ret != 0); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     krb5_get_init_creds_opt_init (&opt); |     krb5_get_init_creds_opt_init (&opt); | ||||||
|      |      | ||||||
|     krb5_get_init_creds_opt_set_default_flags(context, "kinit",  |     krb5_get_init_creds_opt_set_default_flags(context, "kinit",  | ||||||
| @@ -486,17 +464,6 @@ main (int argc, char **argv) | |||||||
| 					       etype_str.num_strings); | 					       etype_str.num_strings); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| #ifdef KRB4 |  | ||||||
|     get_v4_tgt = krb5_config_get_bool_default (context, |  | ||||||
| 					       NULL, |  | ||||||
| 					       get_v4_tgt, |  | ||||||
| 					       "realms", |  | ||||||
| 					       *krb5_princ_realm(context, |  | ||||||
| 								 principal), |  | ||||||
| 					       "krb4_get_tickets", |  | ||||||
| 					       NULL); |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
|     if(use_keytab || keytab_str) { |     if(use_keytab || keytab_str) { | ||||||
| 	krb5_keytab kt; | 	krb5_keytab kt; | ||||||
| 	if(keytab_str) | 	if(keytab_str) | ||||||
| @@ -573,22 +540,134 @@ main (int argc, char **argv) | |||||||
| 	krb5_err (context, 1, ret, "krb5_cc_initialize"); | 	krb5_err (context, 1, ret, "krb5_cc_initialize"); | ||||||
|      |      | ||||||
|     ret = krb5_cc_store_cred (context, ccache, &cred); |     ret = krb5_cc_store_cred (context, ccache, &cred); | ||||||
|  |  | ||||||
|  |     krb5_free_creds_contents (context, &cred); | ||||||
|  |  | ||||||
|  |     return ret; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int | ||||||
|  | main (int argc, char **argv) | ||||||
|  | { | ||||||
|  |     krb5_error_code ret; | ||||||
|  |     krb5_context context; | ||||||
|  |     krb5_ccache  ccache; | ||||||
|  |     krb5_principal principal; | ||||||
|  |     int optind = 0; | ||||||
|  |     krb5_deltat ticket_life = 0; | ||||||
|  |  | ||||||
|  |     setprogname (argv[0]); | ||||||
|  |      | ||||||
|  |     ret = krb5_init_context (&context); | ||||||
|     if (ret) |     if (ret) | ||||||
| 	krb5_err (context, 1, ret, "krb5_cc_store_cred"); | 	errx(1, "krb5_init_context failed: %d", ret); | ||||||
|  |    | ||||||
|  |     /* XXX no way to figure out if set without explict test */ | ||||||
|  |     if(krb5_config_get_string(context, NULL, "libdefaults",  | ||||||
|  | 			      "forwardable", NULL)) | ||||||
|  | 	forwardable_flag = krb5_config_get_bool (context, NULL, | ||||||
|  | 						 "libdefaults", | ||||||
|  | 						 "forwardable", | ||||||
|  | 						 NULL); | ||||||
|  |  | ||||||
| #ifdef KRB4 | #ifdef KRB4 | ||||||
|     if(get_v4_tgt) { |     get_v4_tgt = krb5_config_get_bool_default (context, NULL, | ||||||
| 	CREDENTIALS c; | 					       get_v4_tgt, | ||||||
| 	ret = krb524_convert_creds_kdc_ccache(context, ccache, &cred, &c); | 					       "libdefaults", | ||||||
| 	if(ret) | 					       "krb4_get_tickets", | ||||||
| 	    krb5_warn(context, ret, "converting creds"); | 					       NULL); | ||||||
| 	else | #endif | ||||||
| 	    tf_setup(&c, c.pname, c.pinst); |  | ||||||
| 	memset(&c, 0, sizeof(c)); |     if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optind)) | ||||||
|  | 	usage(1); | ||||||
|  |      | ||||||
|  |     if (help_flag) | ||||||
|  | 	usage (0); | ||||||
|  |  | ||||||
|  |     if(version_flag) { | ||||||
|  | 	print_version(NULL); | ||||||
|  | 	exit(0); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     argc -= optind; | ||||||
|  |     argv += optind; | ||||||
|  |  | ||||||
|  |     if (argv[0]) { | ||||||
|  | 	ret = krb5_parse_name (context, argv[0], &principal); | ||||||
|  | 	if (ret) | ||||||
|  | 	    krb5_err (context, 1, ret, "krb5_parse_name"); | ||||||
|  |     } else { | ||||||
|  | 	ret = kinit_get_default_principal (context, &principal); | ||||||
|  | 	if (ret) | ||||||
|  | 	    krb5_err (context, 1, ret, "krb5_get_default_principal"); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if(fcache_version) | ||||||
|  | 	krb5_set_fcache_version(context, fcache_version); | ||||||
|  |  | ||||||
|  |     if(cred_cache)  | ||||||
|  | 	ret = krb5_cc_resolve(context, cred_cache, &ccache); | ||||||
|  |     else { | ||||||
|  | 	if(argc > 1) { | ||||||
|  | 	    char s[1024]; | ||||||
|  | 	    ret = krb5_cc_gen_new(context, &krb5_fcc_ops, &ccache); | ||||||
|  | 	    if(ret) | ||||||
|  | 		krb5_err(context, 1, ret, "creating cred cache"); | ||||||
|  | 	    snprintf(s, sizeof(s), "%s:%s", | ||||||
|  | 		     krb5_cc_get_type(context, ccache), | ||||||
|  | 		     krb5_cc_get_name(context, ccache)); | ||||||
|  | 	    setenv("KRB5CCNAME", s, 1); | ||||||
|  | #ifdef KRB4 | ||||||
|  | 	    { | ||||||
|  | 		int fd; | ||||||
|  | 		snprintf(s, sizeof(s), "%s_XXXXXX", TKT_ROOT); | ||||||
|  | 		if((fd = mkstemp(s)) >= 0) { | ||||||
|  | 		    close(fd); | ||||||
|  | 		    setenv("KRBTKFILE", s, 1); | ||||||
|  | 		    if (k_hasafs ()) | ||||||
|  | 			k_setpag(); | ||||||
|  | 		} | ||||||
|  | 	    } | ||||||
|  | #endif | ||||||
|  | 	} else | ||||||
|  | 	    ret = krb5_cc_default (context, &ccache); | ||||||
|  |     } | ||||||
|  |     if (ret) | ||||||
|  | 	krb5_err (context, 1, ret, "resolving credentials cache"); | ||||||
|  |  | ||||||
|  |     if (lifetime) { | ||||||
|  | 	int tmp = parse_time (lifetime, "s"); | ||||||
|  | 	if (tmp < 0) | ||||||
|  | 	    errx (1, "unparsable time: %s", lifetime); | ||||||
|  |  | ||||||
|  | 	ticket_life = tmp; | ||||||
|  |     } | ||||||
|  | #ifdef KRB4 | ||||||
|  |     get_v4_tgt = krb5_config_get_bool_default (context, | ||||||
|  | 					       NULL, | ||||||
|  | 					       get_v4_tgt, | ||||||
|  | 					       "realms", | ||||||
|  | 					       krb5_principal_get_realm(context, | ||||||
|  | 									principal), | ||||||
|  | 					       "krb4_get_tickets", | ||||||
|  | 					       NULL); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |      | ||||||
|  |     if(renew_flag || validate_flag) { | ||||||
|  | 	ret = renew_validate(context, renew_flag, validate_flag,  | ||||||
|  | 			     ccache, server, ticket_life); | ||||||
|  | 	exit(ret != 0); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if(!convert_524) | ||||||
|  | 	get_new_tickets(context, principal, ccache, ticket_life); | ||||||
|  |  | ||||||
|  | #ifdef KRB4 | ||||||
|  |     if(get_v4_tgt) | ||||||
|  | 	do_524init(context, ccache, NULL, server); | ||||||
|     if(do_afslog && k_hasafs()) |     if(do_afslog && k_hasafs()) | ||||||
| 	krb5_afslog(context, ccache, NULL, NULL); | 	krb5_afslog(context, ccache, NULL, NULL); | ||||||
|     krb5_free_creds_contents (context, &cred); |  | ||||||
| #endif | #endif | ||||||
|     if(argc > 1) { |     if(argc > 1) { | ||||||
| 	simple_execvp(argv[1], argv+1); | 	simple_execvp(argv[1], argv+1); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Johan Danielsson
					Johan Danielsson