add --cache-type that allows the user to control the resulting
credential cache type, inherit the type from the invoking process git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@14574 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1995 - 2003 Kungliga Tekniska H<>gskolan
|
* Copyright (c) 1995 - 2005 Kungliga Tekniska H<>gskolan
|
||||||
* (Royal Institute of Technology, Stockholm, Sweden).
|
* (Royal Institute of Technology, Stockholm, Sweden).
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
@@ -71,9 +71,15 @@ RCSID("$Id$");
|
|||||||
static int help_flag;
|
static int help_flag;
|
||||||
static int version_flag;
|
static int version_flag;
|
||||||
static int c_flag;
|
static int c_flag;
|
||||||
|
#ifdef KRB5
|
||||||
|
static char *typename_arg;
|
||||||
|
#endif
|
||||||
|
|
||||||
struct getargs getargs[] = {
|
struct getargs getargs[] = {
|
||||||
{ NULL, 'c', arg_flag, &c_flag },
|
{ NULL, 'c', arg_flag, &c_flag },
|
||||||
|
#ifdef KRB5
|
||||||
|
{ "cache-type", 0, arg_string, &typename_arg },
|
||||||
|
#endif
|
||||||
{ "version", 0, arg_flag, &version_flag },
|
{ "version", 0, arg_flag, &version_flag },
|
||||||
{ "help", 'h', arg_flag, &help_flag },
|
{ "help", 'h', arg_flag, &help_flag },
|
||||||
};
|
};
|
||||||
@@ -117,13 +123,57 @@ main(int argc, char **argv)
|
|||||||
argv += optind;
|
argv += optind;
|
||||||
|
|
||||||
#ifdef KRB5
|
#ifdef KRB5
|
||||||
snprintf (tf, sizeof(tf), "%sXXXXXX", KRB5_DEFAULT_CCROOT);
|
{
|
||||||
f = mkstemp (tf + 5);
|
const krb5_cc_ops *type;
|
||||||
if (f < 0)
|
krb5_error_code ret;
|
||||||
err(1, "mkstemp failed");
|
krb5_context context;
|
||||||
close (f);
|
krb5_ccache id;
|
||||||
unlink (tf + 5);
|
const char *name;
|
||||||
|
|
||||||
|
ret = krb5_init_context(&context);
|
||||||
|
if (ret) /* XXX should this really call exit ? */
|
||||||
|
errx(1, "no kerberos 5 support");
|
||||||
|
|
||||||
|
if (typename_arg == NULL) {
|
||||||
|
char *s;
|
||||||
|
|
||||||
|
name = krb5_cc_default_name(context);
|
||||||
|
if (name == NULL)
|
||||||
|
krb5_errx(context, 1, "Failed getting default "
|
||||||
|
"credential cache type");
|
||||||
|
|
||||||
|
typename_arg = strdup(name);
|
||||||
|
if (typename_arg == NULL)
|
||||||
|
errx(1, "strdup");
|
||||||
|
|
||||||
|
s = strchr(typename_arg, ':');
|
||||||
|
if (s)
|
||||||
|
*s = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
type = krb5_cc_get_prefix_ops(context, typename_arg);
|
||||||
|
if (type == NULL)
|
||||||
|
krb5_err(context, 1, ret, "Failed getting ops for %s "
|
||||||
|
"credential cache", typename_arg);
|
||||||
|
|
||||||
|
ret = krb5_cc_gen_new(context, type, &id);
|
||||||
|
if (ret)
|
||||||
|
krb5_err(context, 1, ret, "Failed generating credential cache");
|
||||||
|
|
||||||
|
name = krb5_cc_get_name(context, id);
|
||||||
|
if (name == NULL)
|
||||||
|
krb5_errx(context, 1, "Generated credential cache have no name");
|
||||||
|
|
||||||
|
snprintf(tf, sizeof(tf), "%s:%s", typename_arg, name);
|
||||||
|
|
||||||
|
ret = krb5_cc_close(context, id);
|
||||||
|
if (ret)
|
||||||
|
krb5_err(context, 1, ret, "Failed closing credential cache");
|
||||||
|
|
||||||
|
krb5_free_context(context);
|
||||||
|
|
||||||
esetenv("KRB5CCNAME", tf, 1);
|
esetenv("KRB5CCNAME", tf, 1);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
snprintf (tf, sizeof(tf), "%s_XXXXXX", TKT_ROOT);
|
snprintf (tf, sizeof(tf), "%s_XXXXXX", TKT_ROOT);
|
||||||
|
Reference in New Issue
Block a user