make list caches more useful, support -A

This commit is contained in:
Love Hornquist Astrand
2009-11-22 09:55:13 -08:00
parent b48abe2e0d
commit f4585e3cc3

View File

@@ -3,6 +3,8 @@
* (Royal Institute of Technology, Stockholm, Sweden). * (Royal Institute of Technology, Stockholm, Sweden).
* All rights reserved. * All rights reserved.
* *
* Portions Copyright (c) 2009 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
* are met: * are met:
@@ -57,9 +59,10 @@ printable_time_long(time_t t)
#define COL_EXPIRES NP_(" Expires", "") #define COL_EXPIRES NP_(" Expires", "")
#define COL_FLAGS NP_("Flags", "") #define COL_FLAGS NP_("Flags", "")
#define COL_NAME NP_(" Name", "") #define COL_NAME NP_(" Name", "")
#define COL_PRINCIPAL NP_(" Principal", "") #define COL_PRINCIPAL NP_(" Principal", "in klist output")
#define COL_PRINCIPAL_KVNO NP_(" Principal (kvno)", "") #define COL_PRINCIPAL_KVNO NP_(" Principal (kvno)", "in klist output")
#define COL_CACHENAME NP_(" Cache name", "") #define COL_CACHENAME NP_(" Cache name", "name in klist output")
#define COL_DEFCACHE NP_("", "")
static void static void
print_cred(krb5_context context, krb5_creds *cred, rtbl_t ct, int do_flags) print_cred(krb5_context context, krb5_creds *cred, rtbl_t ct, int do_flags)
@@ -223,7 +226,7 @@ print_tickets (krb5_context context,
char *str, *name; char *str, *name;
krb5_cc_cursor cursor; krb5_cc_cursor cursor;
krb5_creds creds; krb5_creds creds;
int32_t sec, usec; krb5_deltat sec;
rtbl_t ct = NULL; rtbl_t ct = NULL;
@@ -249,9 +252,9 @@ print_tickets (krb5_context context,
printf ("%17s: %d\n", N_("Cache version", ""), printf ("%17s: %d\n", N_("Cache version", ""),
krb5_cc_get_version(context, ccache)); krb5_cc_get_version(context, ccache));
krb5_get_kdc_sec_offset(context, &sec, &usec); ret = krb5_cc_get_kdc_offset(context, ccache, &sec);
if (do_verbose && sec != 0) { if (ret == 0 && do_verbose && sec != 0) {
char buf[BUFSIZ]; char buf[BUFSIZ];
int val; int val;
int sig; int sig;
@@ -431,28 +434,14 @@ display_tokens(int do_verbose)
*/ */
static int static int
display_v5_ccache (const char *cred_cache, int do_test, int do_verbose, display_v5_ccache (krb5_context context, krb5_ccache ccache,
int do_test, int do_verbose,
int do_flags, int do_hidden) int do_flags, int do_hidden)
{ {
krb5_error_code ret; krb5_error_code ret;
krb5_context context;
krb5_ccache ccache;
krb5_principal principal; krb5_principal principal;
int exit_status = 0; int exit_status = 0;
ret = krb5_init_context (&context);
if (ret)
errx (1, "krb5_init_context failed: %d", ret);
if(cred_cache) {
ret = krb5_cc_resolve(context, cred_cache, &ccache);
if (ret)
krb5_err (context, 1, ret, "%s", cred_cache);
} else {
ret = krb5_cc_default (context, &ccache);
if (ret)
krb5_err (context, 1, ret, "krb5_cc_resolve");
}
ret = krb5_cc_get_principal (context, ccache, &principal); ret = krb5_cc_get_principal (context, ccache, &principal);
if (ret) { if (ret) {
@@ -475,7 +464,7 @@ display_v5_ccache (const char *cred_cache, int do_test, int do_verbose,
krb5_err (context, 1, ret, "krb5_cc_close"); krb5_err (context, 1, ret, "krb5_cc_close");
krb5_free_principal (context, principal); krb5_free_principal (context, principal);
krb5_free_context (context);
return exit_status; return exit_status;
} }
@@ -484,17 +473,19 @@ display_v5_ccache (const char *cred_cache, int do_test, int do_verbose,
*/ */
static int static int
list_caches(void) list_caches(krb5_context context)
{ {
krb5_cc_cache_cursor cursor; krb5_cc_cache_cursor cursor;
krb5_context context; const char *cdef_name;
char *def_name;
krb5_error_code ret; krb5_error_code ret;
krb5_ccache id; krb5_ccache id;
rtbl_t ct; rtbl_t ct;
ret = krb5_init_context (&context); cdef_name = krb5_cc_default_name(context);
if (ret) if (cdef_name == NULL)
errx (1, "krb5_init_context failed: %d", ret); krb5_errx(context, 1, "krb5_cc_default_name");
def_name = strdup(cdef_name);
ret = krb5_cc_cache_get_first (context, NULL, &cursor); ret = krb5_cc_cache_get_first (context, NULL, &cursor);
if (ret == KRB5_CC_NOSUPP) if (ret == KRB5_CC_NOSUPP)
@@ -506,6 +497,7 @@ list_caches(void)
rtbl_add_column(ct, COL_NAME, 0); rtbl_add_column(ct, COL_NAME, 0);
rtbl_add_column(ct, COL_CACHENAME, 0); rtbl_add_column(ct, COL_CACHENAME, 0);
rtbl_add_column(ct, COL_EXPIRES, 0); rtbl_add_column(ct, COL_EXPIRES, 0);
rtbl_add_column(ct, COL_DEFCACHE, 0);
rtbl_set_prefix(ct, " "); rtbl_set_prefix(ct, " ");
rtbl_set_column_prefix(ct, COL_NAME, ""); rtbl_set_column_prefix(ct, COL_NAME, "");
@@ -524,6 +516,7 @@ list_caches(void)
ret = krb5_cc_get_friendly_name(context, id, &name); ret = krb5_cc_get_friendly_name(context, id, &name);
if (ret == 0) { if (ret == 0) {
const char *str; const char *str;
char *fname;
rtbl_add_column_entry(ct, COL_NAME, name); rtbl_add_column_entry(ct, COL_NAME, name);
rtbl_add_column_entry(ct, COL_CACHENAME, rtbl_add_column_entry(ct, COL_CACHENAME,
krb5_cc_get_name(context, id)); krb5_cc_get_name(context, id));
@@ -533,6 +526,17 @@ list_caches(void)
str = printable_time(t); str = printable_time(t);
rtbl_add_column_entry(ct, COL_EXPIRES, str); rtbl_add_column_entry(ct, COL_EXPIRES, str);
free(name); free(name);
ret = krb5_cc_get_full_name(context, id, &fname);
if (ret)
krb5_err (context, 1, ret, "krb5_cc_get_full_name");
if (strcmp(fname, def_name) == 0)
rtbl_add_column_entry(ct, COL_DEFCACHE, "*");
else
rtbl_add_column_entry(ct, COL_DEFCACHE, "");
krb5_xfree(fname);
} }
krb5_cc_close(context, id); krb5_cc_close(context, id);
@@ -541,6 +545,7 @@ list_caches(void)
krb5_cc_cache_end_seq_get(context, cursor); krb5_cc_cache_end_seq_get(context, cursor);
free(def_name);
rtbl_format(ct, stdout); rtbl_format(ct, stdout);
rtbl_destroy(ct); rtbl_destroy(ct);
@@ -555,6 +560,7 @@ static int version_flag = 0;
static int help_flag = 0; static int help_flag = 0;
static int do_verbose = 0; static int do_verbose = 0;
static int do_list_caches = 0; static int do_list_caches = 0;
static int do_all_content = 0;
static int do_test = 0; static int do_test = 0;
#ifndef NO_AFS #ifndef NO_AFS
static int do_tokens = 0; static int do_tokens = 0;
@@ -577,8 +583,10 @@ static struct getargs args[] = {
#endif #endif
{ "v5", '5', arg_flag, &do_v5, { "v5", '5', arg_flag, &do_v5,
NP_("display v5 cred cache", ""), NULL}, NP_("display v5 cred cache", ""), NULL},
{ "all-content", 'A', arg_flag, &do_all_content,
NP_("all caches with their content", ""), NULL },
{ "list-caches", 'l', arg_flag, &do_list_caches, { "list-caches", 'l', arg_flag, &do_list_caches,
NP_("verbose output", ""), NULL }, NP_("list all caches", ""), NULL },
{ "verbose", 'v', arg_flag, &do_verbose, { "verbose", 'v', arg_flag, &do_verbose,
NP_("verbose output", ""), NULL }, NP_("verbose output", ""), NULL },
{ "hidden", 0, arg_flag, &do_hidden, { "hidden", 0, arg_flag, &do_hidden,
@@ -606,6 +614,8 @@ usage (int ret)
int int
main (int argc, char **argv) main (int argc, char **argv)
{ {
krb5_context context;
krb5_error_code ret;
int optidx = 0; int optidx = 0;
int exit_status = 0; int exit_status = 0;
@@ -631,14 +641,50 @@ main (int argc, char **argv)
if (argc != 0) if (argc != 0)
usage (1); usage (1);
ret = krb5_init_context (&context);
if (ret)
errx (1, "krb5_init_context failed: %d", ret);
if (do_list_caches) { if (do_list_caches) {
exit_status = list_caches(); exit_status = list_caches(context);
return exit_status; return exit_status;
} }
if (do_v5) if (do_v5) {
exit_status = display_v5_ccache (cred_cache, do_test, krb5_ccache id;
do_verbose, do_flags, do_hidden);
if (do_all_content) {
krb5_cc_cache_cursor cursor;
ret = krb5_cc_cache_get_first (context, NULL, &cursor);
if (ret)
krb5_err (context, 1, ret, "krb5_cc_cache_get_first");
while (krb5_cc_cache_next (context, cursor, &id) == 0) {
exit_status |= display_v5_ccache(context, id, do_test,
do_verbose, do_flags,
do_hidden);
printf("\n\n");
}
krb5_cc_cache_end_seq_get(context, cursor);
} else {
if(cred_cache) {
ret = krb5_cc_resolve(context, cred_cache, &id);
if (ret)
krb5_err (context, 1, ret, "%s", cred_cache);
} else {
ret = krb5_cc_default (context, &id);
if (ret)
krb5_err (context, 1, ret, "krb5_cc_resolve");
}
exit_status = display_v5_ccache(context, id, do_test,
do_verbose, do_flags,
do_hidden);
}
}
if (!do_test) { if (!do_test) {
#ifndef NO_AFS #ifndef NO_AFS
@@ -650,5 +696,7 @@ main (int argc, char **argv)
#endif #endif
} }
krb5_free_context(context);
return exit_status; return exit_status;
} }