when running kinit with a subprocess, fetch new tickets after half the
tickets lifetime git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@13465 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
		| @@ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * Copyright (c) 1997-2003 Kungliga Tekniska H<>gskolan | ||||
|  * Copyright (c) 1997-2004 Kungliga Tekniska H<>gskolan | ||||
|  * (Royal Institute of Technology, Stockholm, Sweden).  | ||||
|  * All rights reserved.  | ||||
|  * | ||||
| @@ -145,6 +145,7 @@ static struct getargs args[] = { | ||||
|  | ||||
|     { "request-pac",	0,   arg_flag,	&pac_flag, | ||||
|       "request a Windows PAC" }, | ||||
|  | ||||
| #ifdef PKINIT | ||||
|     {  "certificate",  'C',  arg_string, &pk_cert_file, | ||||
|        "principal's public key certificate", "filename"}, | ||||
| @@ -431,7 +432,8 @@ static krb5_error_code | ||||
| get_new_tickets(krb5_context context,  | ||||
| 		krb5_principal principal, | ||||
| 		krb5_ccache ccache, | ||||
| 		krb5_deltat ticket_life) | ||||
| 		krb5_deltat ticket_life, | ||||
| 		int interactive) | ||||
| { | ||||
|     krb5_error_code ret; | ||||
|     krb5_get_init_creds_opt *opt; | ||||
| @@ -544,6 +546,10 @@ get_new_tickets(krb5_context context, | ||||
| 					    start_time, | ||||
| 					    server, | ||||
| 					    opt); | ||||
|     } else if (!interactive) { | ||||
| 	krb5_warnx(context, "Not interactive, failed to get initial ticket"); | ||||
| 	krb5_get_init_creds_opt_free(opt); | ||||
| 	return 0; | ||||
|     } else { | ||||
| 	char *p, *prompt; | ||||
|  | ||||
| @@ -628,6 +634,74 @@ get_new_tickets(krb5_context context, | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| static time_t | ||||
| ticket_lifetime(krb5_context context, krb5_ccache cache,  | ||||
| 		krb5_principal client, const char *server) | ||||
| { | ||||
|     krb5_creds in_cred, *cred; | ||||
|     krb5_error_code ret; | ||||
|     time_t timeout; | ||||
|  | ||||
|     memset(&in_cred, 0, sizeof(in_cred)); | ||||
|  | ||||
|     ret = krb5_cc_get_principal(context, cache, &in_cred.client); | ||||
|     if(ret) { | ||||
| 	krb5_warn(context, ret, "krb5_cc_get_principal"); | ||||
| 	return 0; | ||||
|     } | ||||
|     ret = get_server(context, in_cred.client, server, &in_cred.server); | ||||
|     if(ret) { | ||||
| 	krb5_free_principal(context, in_cred.client); | ||||
| 	krb5_warn(context, ret, "get_server"); | ||||
| 	return 0; | ||||
|     } | ||||
|  | ||||
|     ret = krb5_get_credentials(context, KRB5_GC_CACHED, | ||||
| 			       cache, &in_cred, &cred); | ||||
|     krb5_free_principal(context, in_cred.client); | ||||
|     krb5_free_principal(context, in_cred.server); | ||||
|     if(ret) { | ||||
| 	krb5_warn(context, ret, "krb5_get_credentials"); | ||||
| 	return 0; | ||||
|     } | ||||
|     timeout = cred->times.endtime - cred->times.starttime; | ||||
|     if (timeout < 0) | ||||
| 	timeout = 0; | ||||
|     krb5_free_creds(context, cred); | ||||
|     return timeout; | ||||
| } | ||||
|  | ||||
| struct renew_ctx { | ||||
|     krb5_context context; | ||||
|     krb5_ccache  ccache; | ||||
|     krb5_principal principal; | ||||
|     krb5_deltat ticket_life; | ||||
| }; | ||||
|  | ||||
| static time_t | ||||
| renew_func(void *ptr) | ||||
| { | ||||
|     struct renew_ctx *ctx = ptr; | ||||
|     krb5_error_code ret; | ||||
|     time_t expire; | ||||
|  | ||||
|  | ||||
|     ret = renew_validate(ctx->context, renewable_flag, validate_flag, | ||||
| 			     ctx->ccache, server, ctx->ticket_life); | ||||
|     if (ret) | ||||
| 	get_new_tickets(ctx->context, ctx->principal,  | ||||
| 			ctx->ccache, ctx->ticket_life, 0); | ||||
|  | ||||
|     if(get_v4_tgt || convert_524) | ||||
| 	do_524init(ctx->context, ctx->ccache, NULL, server); | ||||
|     if(do_afslog && k_hasafs()) | ||||
| 	krb5_afslog(ctx->context, ctx->ccache, NULL, NULL); | ||||
|  | ||||
|     expire = ticket_lifetime(ctx->context, ctx->ccache, ctx->principal, | ||||
| 			     server) / 2; | ||||
|     return expire + 1; | ||||
| } | ||||
|  | ||||
| int | ||||
| main (int argc, char **argv) | ||||
| { | ||||
| @@ -756,14 +830,26 @@ main (int argc, char **argv) | ||||
|     } | ||||
|  | ||||
|     if(!convert_524) | ||||
| 	get_new_tickets(context, principal, ccache, ticket_life); | ||||
| 	get_new_tickets(context, principal, ccache, ticket_life, 1); | ||||
|  | ||||
|     if(get_v4_tgt || convert_524) | ||||
| 	do_524init(context, ccache, NULL, server); | ||||
|     if(do_afslog && k_hasafs()) | ||||
| 	krb5_afslog(context, ccache, NULL, NULL); | ||||
|     if(argc > 1) { | ||||
| 	ret = simple_execvp(argv[1], argv+1); | ||||
| 	struct renew_ctx ctx; | ||||
| 	time_t timeout; | ||||
|  | ||||
| 	timeout = ticket_lifetime(context, ccache, principal, server) / 2; | ||||
|  | ||||
| 	ctx.context = context; | ||||
| 	ctx.ccache = ccache; | ||||
| 	ctx.principal = principal; | ||||
| 	ctx.ticket_life = ticket_life; | ||||
|  | ||||
| 	ret = simple_execvp_timed(argv[1], argv+1,  | ||||
| 				  renew_func, &ctx, timeout); | ||||
|  | ||||
| 	krb5_cc_destroy(context, ccache); | ||||
| 	_krb5_krb_dest_tkt(context, krb4_cc_name); | ||||
| 	if(k_hasafs()) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Love Hörnquist Åstrand
					Love Hörnquist Åstrand