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 | ||||
| extern int do_afslog; | ||||
| extern int get_v4_tgt; | ||||
| int convert_524; | ||||
| #endif | ||||
| int fcache_version; | ||||
|  | ||||
| @@ -187,6 +188,9 @@ static struct getargs args[] = { | ||||
|     { "524init", 	'4', arg_flag, &get_v4_tgt, | ||||
|       "obtain version 4 TGT" }, | ||||
|      | ||||
|     { "524convert", 	'9', arg_flag, &convert_524, | ||||
|       "only convert ticket to version 4" }, | ||||
|      | ||||
|     { "afslog", 	0  , arg_flag, &do_afslog, | ||||
|       "obtain afs tokens"  }, | ||||
| #endif | ||||
| @@ -252,6 +256,56 @@ usage (int 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 | ||||
| renew_validate(krb5_context context,  | ||||
| 	       int renew, | ||||
| @@ -317,6 +371,18 @@ renew_validate(krb5_context context, | ||||
| 	goto 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); | ||||
|     if(ret) { | ||||
| 	krb5_warn(context, ret, "krb5_cc_store_cred"); | ||||
| @@ -327,108 +393,20 @@ out: | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| int | ||||
| main (int argc, char **argv) | ||||
| static krb5_error_code | ||||
| get_new_tickets(krb5_context context,  | ||||
| 		krb5_principal principal, | ||||
| 		krb5_ccache ccache, | ||||
| 		krb5_deltat ticket_life) | ||||
| { | ||||
|     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_deltat start_time = 0; | ||||
|     krb5_deltat ticket_life = 0; | ||||
|     krb5_addresses no_addrs; | ||||
|     krb5_creds cred; | ||||
|     char passwd[256]; | ||||
|     krb5_deltat start_time = 0; | ||||
|  | ||||
|     setprogname (argv[0]); | ||||
|     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); | ||||
|      | ||||
| @@ -486,17 +464,6 @@ main (int argc, char **argv) | ||||
| 					       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) { | ||||
| 	krb5_keytab kt; | ||||
| 	if(keytab_str) | ||||
| @@ -573,22 +540,134 @@ main (int argc, char **argv) | ||||
| 	krb5_err (context, 1, ret, "krb5_cc_initialize"); | ||||
|      | ||||
|     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) | ||||
| 	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 | ||||
|     if(get_v4_tgt) { | ||||
| 	CREDENTIALS c; | ||||
| 	ret = krb524_convert_creds_kdc_ccache(context, ccache, &cred, &c); | ||||
| 	if(ret) | ||||
| 	    krb5_warn(context, ret, "converting creds"); | ||||
| 	else | ||||
| 	    tf_setup(&c, c.pname, c.pinst); | ||||
| 	memset(&c, 0, sizeof(c)); | ||||
|     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 | ||||
| 	    { | ||||
| 		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()) | ||||
| 	krb5_afslog(context, ccache, NULL, NULL); | ||||
|     krb5_free_creds_contents (context, &cred); | ||||
| #endif | ||||
|     if(argc > 1) { | ||||
| 	simple_execvp(argv[1], argv+1); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Johan Danielsson
					Johan Danielsson